<?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>UGamela Blog &#187; Phlame</title>
	<atom:link href="http://ugamela-blog.pheelgood.net/tag/phlame/feed/" rel="self" type="application/rss+xml" />
	<link>http://ugamela-blog.pheelgood.net</link>
	<description>Entwicklung eines Browsergames</description>
	<lastBuildDate>Tue, 13 Jul 2010 19:44:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Phlame Engine: Entwurf Nr. 3</title>
		<link>http://ugamela-blog.pheelgood.net/2008/11/22/phlame-engine-entwurf-nr-3/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/11/22/phlame-engine-entwurf-nr-3/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 12:29:41 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Phlame]]></category>
		<category><![CDATA[Phlame Engine]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=155</guid>
		<description><![CDATA[Bevor ich meinen neuen Entwurf erkläre, der übrigens auf Entwurf Nr. 2 basiert &#8211; ich habe also nicht wieder alles verworfen -, möchte ich eine Analogie voranstellen: Anfängliches Programmieren ist wie Gartenhäuschen bauen Gutes Pogrammieren ist wie schöne, verzierte Gartenhäuschen bauen Professionelles Programmieren ist wie Hochhäuser bauen Dies habe ich am Mittwoch, als ich den [...]]]></description>
			<content:encoded><![CDATA[<p>Bevor ich meinen neuen Entwurf erkläre, der übrigens auf Entwurf Nr. 2 basiert &#8211; ich habe also nicht wieder alles verworfen -, möchte ich eine Analogie voranstellen:</p>
<blockquote><p>Anfängliches Programmieren ist wie Gartenhäuschen bauen</p>
<p>Gutes Pogrammieren ist wie schöne, verzierte Gartenhäuschen bauen</p>
<p>Professionelles Programmieren ist wie Hochhäuser bauen</p></blockquote>
<p><span id="more-155"></span>Dies habe ich am Mittwoch, als ich den Uni für Einsteiger Tag in Karlruhe besucht habe, bei einem Professor für Informatik in einer Präsentation gesehen und es gefällt mir sehr gut, weil es bestens auf das Problem hinweist:</p>
<blockquote><p>Hochhäuser sind keine großen Gartenhäuschen!</p></blockquote>
<p>Beim Hochbau muss man noch viel mehr Statik und weitere Probleme beachten und beim Programmieren ist das nicht anders. Man kann &#8211; selbst mit gutem Code &#8211; nicht so einfach große Projekte aufziehen.</p>
<p>Ich lerne momentan den Hochbau und hoffe mit diesen Kenntnissen ein ansehnliches Haus hochziehen zu können. Sobald das steht, wird es wieder einfacher, die Verzierung eines Hochhauses wird wohl nicht schwieriger als das eines Gartenhäuschens und ich werde Hilfe brauchen, denn es wird viel zu tun geben.</p>
<p><strong>Nun zu meinen neuen Entwurf</strong></p>
<p>Wer noch den zweiten Entwurf kennt wird sich wundern, weil ich ein paar Sachen umbenannt habe. DataHandler heißt nun Service und Model Phlame, Sub oder Modul.</p>
<p>Ich bitte nun die, die nicht den zweiten Entwurf kennen, einen Blick darauf zu werfen, damit ich diesen Teil nicht wiederholen muss. <a href="http://ugamela-blog.pheelgood.net/2008/09/26/phlame-engine-der-entwurf-nr2/">http://ugamela-blog.pheelgood.net/2008/09/26/phlame-engine-der-entwurf-nr2/</a></p>
<div style="float:left;"><a href="http://ugamela-blog.pheelgood.net/wp-content/uploads/2008/11/entwurf3-diagramm-ueberblick.gif"><img class="size-medium wp-image-156 alignleft" title="entwurf3-diagramm-ueberblick" src="http://ugamela-blog.pheelgood.net/wp-content/uploads/2008/11/entwurf3-diagramm-ueberblick-300x200.gif" alt="Diagramm zum dritten Entwurf" width="300" height="200" /></a></p>
<div class="mceTemp">
<dl id="attachment_156" class="wp-caption alignleft" style="width: 310px;">
<dd class="wp-caption-dd">Diagramm zum dritten Entwurf</dd>
</dl>
</div>
</div>
<p>Der Requester (mir fällt kein besserer Name ein) führt die Abfragen gegen die Datenbank aus. Zwischen den Requester und den Service wird ein Cachemechanismus mit der Session gebaut (der Requester wird <a title="Wikipedia: Decorator" href="http://de.wikipedia.org/w/index.php?title=Decorator">dekoriert</a>). Das sollte einige Queries einsparen. Auch das Datenbankupdate wird selbständig und querysparend vom Requester übernommen. Pro Tabelle gibt es einen Requester.  Modul-, Sub- und Phlamerequester unterscheiden sich wahrscheinlich an ein paar Stellen. Gleichzeitig dient der Requester als Spiecher für Queryschablonen für die jeweilige Tabelle. Wahrscheinlich lässt sich auch durch austauschen der Requester die Datenbank wechseln (auf PostgreSQL zB), aber vorerst habe ich nur MySQL mit mysqli vorgesehen.</p>
<p>Der Service wird &#8211; im Gegensatz zum Requester &#8211; vom Programmierer direkt angesprochen und ist einmalig überall verfügbar (<a title="Blogeintrag; Entwurfsmuster" href="http://ugamela-blog.pheelgood.net/2008/11/18/php-programmierung-entwurfsmuster-design-patterns/">Singleton</a>). Er verwaltet die Instanzen eines Objektes, die im Umlauf sind, und ruft den Requester auf. Das packen der Datenarrays in Objekte geschieht im Service bzw. in der Fabrik, mit der Phlame, Sub, Modul oder einer entsprechenden abgeleiteten Klasse.</p>
<p>Phlame (Flamme oder Flämmchen zu deutsch^^, nicht von Belang) ist eine Vorlage für diverse Objektformen, die von dieser Klasse abgeleitet werden können. Das bedeutet sie enthält ein paar Vorgaben, wie ein solches Spielobjekt auszusehen hat. Vorgesehene Ableitungen sind Sonnensystem (auch bekannt als Planeten..) und Flotte.</p>
<p>Sub ist eine Untergruppierung von Phlame. Der Aufbau ist der selbe wie beim Phlame selbst, nur das der Service vom Phlame-Service oder der Fabrik aufgerufen wird, der die Subs in das Phlame schachtelt. Vorgesehene Ableitungen sind Schiffe und Gebäude.</p>
<p>Modul ist Sub sehr ähnlich, stellt aber nur einzelne Eigeschaften von Sub oder (weniger) Phlame dar (die Verbindung zu Phlame ist im Diagramm nicht angezeigt). Der Service wird also vom übergeordneten Service oder der übergeordneten Fabrik aufgerufen und die Module werden in das übergeordnete Objekt geschachtelt.</p>
<p>Resultat sollte ein <a title="Blogeintrag: ORM" href="http://ugamela-blog.pheelgood.net/2008/11/19/orm-object-relational-mapping-objektrelationale-abbildung/">ORM</a> Schema sein. Phlames sind Objekte mit Unterobjekten, die automatisch (ohne Serialisierung) in der Datenbank gespeichert werden. Dadurch lässt sich übrigens auch weiterhin ohne die Objekte arbeiten, vor allem MySQL intern.</p>
<p>Benötigen tue ich dieses Schema vor allem für sehr variable Kämpfe, also Objektinteraktion und einfach freiere Modellierung der Objekte selbst und ihren Beziehungen zu anderen im Spiel.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/11/22/phlame-engine-entwurf-nr-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phlame Engine: Weitere Überarbeitungen, Module</title>
		<link>http://ugamela-blog.pheelgood.net/2008/10/11/phlame-engine-weitere-uberarbeitungen/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/10/11/phlame-engine-weitere-uberarbeitungen/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 17:01:07 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Module]]></category>
		<category><![CDATA[Phlame]]></category>
		<category><![CDATA[Phlame Engine]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=98</guid>
		<description><![CDATA[Die Phlame Engine wird natürlich weiterentwickelt, auch wenn ich dieser Tage besonders wenig Zeit habe, diese Woche schreibe ich zB zwei Arbeiten und zwei Tests in der Schule, da bleibt nicht viel Zeit für Programmieren. Ich muss das Schema, das ich aufgestellt hatte, revidieren. Das Datahandler verliert eine seiner Rollen, das Erstellen der Models. Diese [...]]]></description>
			<content:encoded><![CDATA[<p>Die Phlame Engine wird natürlich weiterentwickelt, auch wenn ich dieser Tage besonders wenig Zeit habe, diese Woche schreibe ich zB zwei Arbeiten und zwei Tests in der Schule, da bleibt nicht viel Zeit für Programmieren.</p>
<p>Ich muss das Schema, das ich aufgestellt hatte, revidieren. Das Datahandler verliert eine seiner Rollen, das Erstellen der Models. Diese werden direkt in den Requestern gebildet um ein paar Schleifen zu sparen, und haben dadurch auch eine Bindung zu diesen, die ich nicht Cachen möchte, da die Requester eigentlich eine Erweiterung der Datenbankverwaltung darstellen, welche eine Resource ist (Resourcen kann man nicht serialisieren/cachen).</p>
<p>Ich habe kürzlich ein neues Forum entdeckt, das mir gefällt: <a title="Galaxy News" href="http://www.galaxy-news.de" target="_blank">http://www.galaxy-news.de</a></p>
<p>Dort habe ich ein paar ähnlich gesinnte Entwickler gefunden. Hier die erste teils &#8220;geklaute&#8221; Idee:</p>
<p>Die Models erhalten Module, die entweder selbst Models (zB im Falle einer Flotte Schiffe) oder eben bestimmte Module, mehr dazu gleich.</p>
<p>Ich habe überlegt den Techtree in Models abzubilden, dadurch hätte man optimale Möglichkeiten an den einzelnen Einheiten herumzubasteln. Für Basisfähigkeiten oder oft Genutztes kann man in Module, wie oben beschrieben verpacken. Für die Basisfähigkeiten gibt es zudem noch eine (abstrakte) Basisklasse (zB Ship) die bestimmte Fähigkeiten bereits vorgibt oder vorraussetzt. Der Vorteil an den Modulen wäre allerdings auch noch, dass man sie vllt sogar über ein grafisches Interface im Adminbereich in bestimmte Einheiten einbauen könnte. Diese Module wären tatsächlich auch von außen modular, das heißt man könnte die Dateien einfach auch (de)installieren.</p>
<p>Die Idee ist gerade im Anfangsstadium, kann gut sein, dass ich dies die Tage nochmal umdenke und editiere.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/10/11/phlame-engine-weitere-uberarbeitungen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phlame Engine: Der Entwurf (Nr.2)</title>
		<link>http://ugamela-blog.pheelgood.net/2008/09/26/phlame-engine-der-entwurf-nr2/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/09/26/phlame-engine-der-entwurf-nr2/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:48:28 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Core]]></category>
		<category><![CDATA[Phlame]]></category>
		<category><![CDATA[Phlame Engine]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=81</guid>
		<description><![CDATA[Der DataHandler Mich hatte schon vor dem Sommer der Gedanke interessiert die Daten innerhalb von Models(Dartstellung realer Objekte) zu verwalten. Eine Flotte oder ein Planet würde als ein entsprechendes Objekt dargestellt werden. PHP ist keine reine OOP Sprache und ich habe OOP selbst erst seit April/Mai gelernt, daher fiel mir das nicht besonders leicht. Ich [...]]]></description>
			<content:encoded><![CDATA[<h1>Der DataHandler</h1>
<p>Mich hatte schon vor dem Sommer der Gedanke interessiert die Daten innerhalb von Models(Dartstellung realer Objekte) zu verwalten. Eine Flotte oder ein Planet würde als ein entsprechendes Objekt dargestellt werden. PHP ist keine reine OOP Sprache und ich habe OOP selbst erst seit April/Mai gelernt, daher fiel mir das nicht besonders leicht.</p>
<p>Ich habe versucht den Artikel verständlich zu halten, setze aber ab jetzt einige Kenntnisse für das Verständnis voraus (PHP, OOP und BG Projekte). Wen das trotzdem interessiert, der muss Wissenslücken schließen. Ich kann Google empfehlen ;D</p>
<p>Im Mittelpunkt stand meikels Idee des Cores der alles wichtige erledigt, doch das erweist sich für mich als nicht die richtige Lösung, da man nicht immer DB, Sessions, Authentification braucht. Genau genommen braucht man Auth nur einmal, beim Login. Auth basiert auf den Sessions, aber die Sessions sind unabhängig von der Datenbank. Daher ist eine Vererbung unsinnig, selbst wenn alle einen Singleton verwenden. Core (die letzte der 4 Klassen) hatte ich dazu missbraucht irgendwelche Funktionen zu lagern, die eigentlich komplett unabhängig wären (zB die Umformatierung von Arrays in einem bestimmten Stil).</p>
<p>Dazu kamen Models, die jeweils selbst ihre Datenbankeinträge kontrollierten, indem sie alle von einer bestimmten Klasse abgeleitet wurden. Das Problem war die Ineffizienz. Teils wollte ich einfach mehrere Flotten mit einem Query aus der Datenbank holen.</p>
<dl id="attachment_82" class="wp-caption alignleft" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://ugamela-blog.pheelgood.net/wp-content/uploads/2008/09/datahandler-uberblick.gif"><img class="size-medium wp-image-82 alignleft" title="DataHandler Überblick" src="http://ugamela-blog.pheelgood.net/wp-content/uploads/2008/09/datahandler-uberblick-300x200.gif" alt="Überblick DataHandler" width="300" height="200" /></a></dt>
</dl>
<p>Daher habe ich etwas neues mit einem zentralen DataHandler entworfen, der es erlaubt mehrere Flotten (oder ähnliches) gleichzeitig zu laden. Ich habe das Prinzip nirgendwo aus dem Internet abgeschrieben, aber natürlich kann es sein, dass das schonmal jemand erfunden hat&#8230;</p>
<p>Ich hoffe nun, dass sich keine weiteren Probleme auftun und arbeite daran das Konzept umzusetzten. Einiger Code des vorigen Konzepts lässt sich zum Glück wiederverwerten [Ich hatte das recht weit entwickelt..]!</p>
<p>Momentan hänge ich an einer kleinen Entscheidung: Der Datahandler verwaltet die DatenArrays und erstellt Zugriffsobjekte (Flotten, Schiffe, Planeten, etc.). Sollten die Zugriffsobjekte (aka Models) mit Referenzen auf die Arrays im DataHandler enthalten oder lieber Kopien und diese bei Zerstörung (spät. bei Scriptende) zurückgeben?</p>
<p>Ich mag Referenzen nicht, aber ich denke ich werde sie verwenden um zu verhindern, dass es Überschreibungen gibt, wenn man zweimal das selbe Objekt aus dem Datahandler holt, sonst müsste dieser die ausgegeben Objekte speichern&#8230; Nein das wird mir zu komplex und sonst nur fehleranfällig.</p>
<p>Meinungen?</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/09/26/phlame-engine-der-entwurf-nr2/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Race Conditions, ein BG Problem (Flottenverdoppelung)</title>
		<link>http://ugamela-blog.pheelgood.net/2008/09/15/race-conditions-ein-bg-problem-flottenverdoppelung/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/09/15/race-conditions-ein-bg-problem-flottenverdoppelung/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 16:43:37 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Flottenverdoppelung]]></category>
		<category><![CDATA[MySQL Prozedur]]></category>
		<category><![CDATA[Phlame]]></category>
		<category><![CDATA[Race Condition]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=65</guid>
		<description><![CDATA[Ich werde nun nicht nochmal selbst Race Conditions erklären, wenn das schon sehr gut auf Wikipedia beschrieben ist. Link Bei einem PHP Apache Server agieren ständig mehrere Threads, Scripte oder System (wie auch immer man sie nennen will) gleichzeitig. Jedes Mal wenn ein User einen Script aufruft (quasi immer wenn er irgendwo draufdrückt), wird ein [...]]]></description>
			<content:encoded><![CDATA[<p>Ich werde nun nicht nochmal selbst Race Conditions erklären, wenn das schon sehr gut auf Wikipedia beschrieben ist. <a title="Wikipedia: Race Condition" href="http://de.wikipedia.org/wiki/Race_Condition">Link</a></p>
<p>Bei einem PHP Apache Server agieren ständig mehrere Threads, Scripte oder System (wie auch immer man sie nennen will) gleichzeitig. Jedes Mal wenn ein User einen Script aufruft (quasi immer wenn er irgendwo draufdrückt), wird ein neuer Thread für ihn gebildet, dieser läuft parallel zu den anderen.</p>
<p>Ein BG (Browsergame) wie UGamela hat &#8211; wie Viele gar nicht wissen &#8211; eine komplexe Spiellogik im Inneren, welche bei bisherigen Versionen nur hingemurkst wurde. Beispiel siehe <a title="Link zum Thema" href="http://ugamela-blog.pheelgood.net/tag/fusionskraftwerkbug/">Fusionskraftwerkbug</a>.</p>
<p>Ein weiteres Problem stellt die insgesamt schlechte Programmierung und somit unnötig und zu lange Berechnungszeit der Scripte dar, je länger der zeitliche Abstand zwischen dem SQL Select Befehl und dem SQL Update Befehl, desto höher die Wahrscheinlichkeit, dass es zu einem Race Condition bedingten Fehler kommt.</p>
<p>Häufigster bekannter Fehler dieser Art ist das Problem der Flottenverdoppelung!</p>
<p>Problemlösung ist in diesem Fall wirklich nicht so einfach, vor allem wenn man nicht noch längere Berechnungszeiten und somit irgendwann Wartezeiten für die User riskieren will.</p>
<p>MySQL stellt dafür einen Befehl bereit, der eine ganze Tabelle sperrt (&#8220;LOCK TABLE `xx`&#8221;) &#8211; anstehende Queries warten. Für die ganze Tabelle!! Dh letztendlich für alle Threads, dabei ist gar nicht klar, ob sich die Queries überhaupt überschneiden. Bei größeren Userzahlen gleichzeitig wird das dann wirklich spaßig, wenn die Wartezeiten immer länger werden.</p>
<p>Interessanter wäre es doch die einzelnen Einträge zu Sperren. Doch dies ist mit einigem Aufwand verbunden, weil ich aus Performancegründen benötigte Daten in einem Rutsch laden will (zB die Planeten des Spielers gleichzeitig). Dennoch soll es tief im Grundgerüst verankert werden, sodass letztlich der Modder keine Ahnung davon haben muss. Er schreibt höchstens sein spezielles &#8220;WHERE&#8221; im SQL Select Befehl.</p>
<p>Hier ein kleiner Einblick: <span id="more-65"></span></p>
<blockquote><p>PREPARE wtnu FROM &#8216;SELECT `used` INTO @used FROM `?pre&#8221;.$table.&#8221;` WHERE &#8220;.$where.&#8221; &#8216;<br />
oder PREPARE wtnu FROM &#8216;SELECT SUM(`used`) AS @used FROM `?pre&#8221;.$table.&#8221;` WHERE &#8220;.$where.&#8221; &#8216;</p>
<p>CREATE PROCEDURE wtnu ()<br />
COMMENT &#8216;wait till not used&#8217;<br />
BEGIN<br />
wloop: LOOP<br />
EXECUTE wtnu;<br />
IF @used &lt;= 0 THEN<br />
LEAVE wloop;<br />
END IF;<br />
SLEEP(0.3);<br />
ITERATE wloop;<br />
END LOOP wloop;<br />
END|</p></blockquote>
<p>1. Query vorbereiten (kommt auf ein oder mehrere Einträge an)<br />
2. Die gezeigt Prozedur aufrufen:<br />
2.1. Vorbereitetes Query aufrufen<br />
2.2. Testen, ob der/die Eintrag/Einträge in Benutzung &#8220;used&#8221; sind.<br />
- wenn ja, warten.. die Schleife beginnt bei 2.1 von neuem.<br />
- wenn nein verlasse die Schleife</p>
<p>Ich muss noch etwas daran feilen, ich weiß noch nicht wie ich das Session Caching miteinbinde und ob die Abfrage für mehrere &#8220;used&#8221; schon das Wahre ist (ein SUM [Summe] Befehl überprüft ob die Einträge zusammen nicht mehr als 0 sind, &#8220;used&#8221; kann 0 oder 1 sein).</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/09/15/race-conditions-ein-bg-problem-flottenverdoppelung/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Spiellogik: Koordinatensystem (Update)</title>
		<link>http://ugamela-blog.pheelgood.net/2008/09/07/spiellogik-koordinatensystem/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/09/07/spiellogik-koordinatensystem/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 16:23:06 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Galaxie]]></category>
		<category><![CDATA[Koordinaten]]></category>
		<category><![CDATA[Koordinatensystem]]></category>
		<category><![CDATA[Logik]]></category>
		<category><![CDATA[Phlame]]></category>
		<category><![CDATA[Planet]]></category>
		<category><![CDATA[Realistik]]></category>
		<category><![CDATA[Sonnensystem]]></category>
		<category><![CDATA[Universum]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=50</guid>
		<description><![CDATA[Linear sollte es nicht sein (OGame).. Zuerst wollte ich ein dreidimensionales System aufbauen, welches von der Berechnung nicht ultimativ schwerer gewesen wäre, aber eindeutig unübersichtlicher und unhandlicher bzw schwierig darzustellen wäre. Die Wahl fällt so auf ein zweidimensionales System, welches man auch in einem Bild darstellen könnte. Distanz im kartesischen X,Y Koordinatensystem nach Pythagoras = [...]]]></description>
			<content:encoded><![CDATA[<p>Linear sollte es nicht sein (OGame)..</p>
<p>Zuerst wollte ich ein dreidimensionales System aufbauen, welches von der Berechnung nicht ultimativ schwerer gewesen wäre, aber eindeutig unübersichtlicher und unhandlicher bzw schwierig darzustellen wäre.</p>
<p>Die Wahl fällt so auf ein zweidimensionales System, welches man auch in einem Bild darstellen könnte.</p>
<p><span id="more-50"></span></p>
<p>Distanz im kartesischen X,Y Koordinatensystem nach Pythagoras = Wurzel( (X2-X1)^2 + (Y2-Y1)^2)</p>
<p>Allerdings gibt es im Universum sehr viel leeren Raum, das heißt um ein möglichst realistisches Spiel zu erzeugen müssen die Koordinaten der System auseinander driften, die Zahlen werden schnell sehr groß und unübersichtlich. Dagegen werde ich eine dritte Koordinate verwenden, die die anderen zwei klein hält.</p>
<p>Aus (1005|3009) wird (AC|5|9) [A=1000, ..]. Ob ich noch zusätzlich eine Koordinate für den Planeten im Sonnensystem hinzufüge, bin ich mir noch nicht im Klaren.</p>
<p>Interessant für die kurzen Strecke wäre auch noch die Planetenbewegung, die wohl eine weitere Variable benötigt (wär ja langweilig wenn alle Planeten die selbe Position in ihrer Umlaufbahn hätten&#8230;).</p>
<p>Langsam wird mir das zu schwierig schriftlich, Bilder wären nicht schlecht, aber ich bin kein Genie mit Bildbearbeitung (das würde nur peinlich werden&#8230;).</p>
<p>Zusammenfassend würde ich sagen werden Koordinaten bald so aussehen: (AB,1,2,3) und vllt wird ein versteckter Faktor die Position in der Umlaufbahn variieren.</p>
<p>Danke an DGLDevil für ein paar Denkanstöße ;D</p>
<p>Update:</p>
<p>Nach längeren Überlegungen rund um die Logik der Distanzen im Universum habe ich mich nun entschieden, mich von den einzelnen Planeten abzuwenden. Es ist einfach unlogisch, dass 15 Planeten in einem Sonnensystem bewohnt sind, vor allem von verschiedenen Spielern bzw Rassen.</p>
<p>Statdessen wird man ganze Sonnensystem bewohnen, die dann noch weitaus mehr Eigenschaftern besitzen als ein Planet könnte (Eine Gasmine auf dem nächstgelegenen Gasplanet?). Das Sonnensystem bekommt drei Koordinaten: X,Y und eine dritte die, wie bereits beschrieben, die beiden anderen etwas reduziert, und gleichzeitig eine Galaxiekennung darstellt</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/09/07/spiellogik-koordinatensystem/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Phlame Engine: Flottengeschwindigkeit, Treibstoff, Bauteile</title>
		<link>http://ugamela-blog.pheelgood.net/2008/09/02/phlame-engine-flottengeschwindigkeit-treibstoff-bauteile/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/09/02/phlame-engine-flottengeschwindigkeit-treibstoff-bauteile/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 12:47:16 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[OGame]]></category>
		<category><![CDATA[Phlame]]></category>
		<category><![CDATA[Phlame Engine]]></category>
		<category><![CDATA[UGamela]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=41</guid>
		<description><![CDATA[Sehn wir uns das mal bei OGame an: Jedes Schiff hat eine bestimmte Geschwindigkeit, die je nach verwendeter Antriebstechnologie noch verbessert werden kann. Um das Problem der Unrealistik mit einem Verbrennungstriebwerk von einer Galaxie zur anderen zu fliegen kümmere ich mich noch. Doch, dass der Treibstoff bei Flottenstart einfach komplett verpufft finde ich doch sehr [...]]]></description>
			<content:encoded><![CDATA[<p>Sehn wir uns das mal bei OGame an:<br />
Jedes Schiff hat eine bestimmte Geschwindigkeit, die je nach verwendeter Antriebstechnologie noch verbessert werden kann. Um das Problem der Unrealistik mit einem Verbrennungstriebwerk von einer Galaxie zur anderen zu fliegen kümmere ich mich noch. Doch, dass der Treibstoff bei Flottenstart einfach komplett verpufft finde ich doch sehr seltsam.</p>
<p>Auch wenn dies einige Rechenarbeit ersparen würde, möchte ich das ändern. Zudem finde ich man sollte Geschwindigkeiten etwas variabler machen.<span id="more-41"></span></p>
<p>Beispiel Auto: Autos haben einen variablen Benzinverbrauch, und natürlich sind nicht alle gleich schnell. Am sparsamsten sind Autos wenn man mit ihnen nicht zu schnell und auch nicht zu langsam fährt. Vom sich wiederholenden Anfahren in der Stadt ganz zu schweigen.</p>
<p>Nun sagen wir jedes Schiff besitzt eine &#8220;beste&#8221; Geschwindigkeit und eine maximale Geschwindigkeit. Ich würde sagen wenn das Schiff nicht &#8220;beste&#8221; Geschwindigkeit fliegt, dann verändert sich der Treibstoffverbrauch mit einem schwachen Exponenten.</p>
<p>Interessant wird noch der Fall des Kampfes, bei dem möglicherweise mitfliegende Tankschiffe zerstört werden. Was macht dann die verbleibende Flotte, die nicht mehr genug Sprit zum heimfliegen hat (Weil dieser nicht schon komplett am Anfang abgezogen wurde&#8230;)? Zuerst mal auf die durchschnittlich &#8220;beste&#8221; (effizienteste) Geschwindigkeit umschalten. Wenn das nicht reicht werden sie wohl irgendwo im Raum ein anfliegbares Gebilde bilden müssen (könnte man theoretisch mit einer Art Planeten- bzw Objekteintrag realisieren).</p>
<p>Die Geschwindikeit wird übrigens wie Angriffs- und Verteidigungswerte nicht mehr variabel an den zugehörigen Ressourcen hängen (Wieso sollten beim Techen gleichzeitig alle Schiffe ausgebaut werden?). Vielmehr kann man dann bei seiner Flotte auf &gt;Aufrüsten&lt; klicken, und muss dafür wieder Ressourcen zahlen. Sogar ein Bauteillager wäre denkbar.</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/09/02/phlame-engine-flottengeschwindigkeit-treibstoff-bauteile/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Phlame Engine: Ressourcenberechnung (Fusionskraftwerkproblem/Endliche Rohstoffe) &amp; Bauliste mit Wartefunktion</title>
		<link>http://ugamela-blog.pheelgood.net/2008/08/30/phlame-engine-ressourcenberechnung-fusionskraftwerkproblem-bauliste-mit-wartefunktion/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/08/30/phlame-engine-ressourcenberechnung-fusionskraftwerkproblem-bauliste-mit-wartefunktion/#comments</comments>
		<pubDate>Sat, 30 Aug 2008 13:36:41 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Bauliste]]></category>
		<category><![CDATA[Fusionskraftwerkbug]]></category>
		<category><![CDATA[Phlame]]></category>
		<category><![CDATA[Phlame Engine]]></category>
		<category><![CDATA[Ressourcenberechnung]]></category>
		<category><![CDATA[UGamela]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=32</guid>
		<description><![CDATA[Ich arbeite schon den ganzen Sommer an der Ressourcenberechnung und gerade zur Zeit an einer Bauliste und dem Eventhandler (Das sind die drei Ebenen der Planetenaktualisierung, die bei jedem Klick geschehen. Daher müssen sie auch besonders performant sein). Mich wundert das noch niemand den Fusionskraftwerkbug bemerkt und ernst genommen hat. Er bedingt einige Funktionalitäten auf [...]]]></description>
			<content:encoded><![CDATA[<p>Ich arbeite schon den ganzen Sommer an der Ressourcenberechnung und gerade zur Zeit an einer Bauliste und dem Eventhandler (Das sind die drei Ebenen der Planetenaktualisierung, die bei jedem Klick geschehen. Daher müssen sie auch besonders performant sein).</p>
<p>Mich wundert das noch niemand den Fusionskraftwerkbug bemerkt und ernst genommen hat. Er bedingt einige Funktionalitäten auf die ich nicht verzichten möchte:</p>
<p>Gebäude mit starkem &#8220;Resourcendrain&#8221; (hoher Verbrauch, höher als die Produktion ist) oder eine sehr knappe Ressource die von bestimmten Gebäuden verbraucht wird.<span id="more-32"></span></p>
<p>Beispiele:<br />
AMmine/Ultramine: Verbraucht AntiMaterie (das nur sehr wenig bis gar nicht produziert wird) und produziert große Mengen von Energie und als Abfallprodukt Aluminium und Silicium&#8230; (gut noch etwas gesponnen sollte aber nur ein Beispiel sein)</p>
<p>Rohstoffwandler: Dieses Gebäude verwandelt Dunkle Masse (die man nur auf Expeditionen findet) langsam in ein Aluminium/Silicium-Gemisch um (Über einen gewissen Zeitraum).</p>
<p>Betanken eines Schiffes: Man lässt eine Extra-Resssorte den Tank herunterzählen (leichter als ein variables Limit einzurichten)  &#8211; Energiebetankung/Laden von Batterien?.</p>
<p><strong>Erklärung des Bugs:</strong><br />
Die Ressberechnung basiert auf dem einfachen Prinzip Produktion (Rohstoff durch Zeit) mal Zeit ergibt Rohstoff. Problematisch wird dies allerdings wenn bestimmte Grenzen erreicht werden. Besonders die untere Grenze wird bisher nicht berücksichtigt, weil die Produktion eigentlich immer positiv ist. Wer den Bug beobachten will, der baue einfach mal das Fusionskraftwerk so weit aus wie möglich, stelle seinen Deutextraktor auf Null und das Kraftwerk auf volle Power. Spannend wird es wenn 0 Deuterium oder weniger erreicht wird (MinusDeut?!).</p>
<p>Um dieses doch etwas komplexere Probleme zu lösen hatte ich zuerst eine Klasse in PHP geschrieben, habe mich dann aber von meikel überzeugen lassen, dass es besser wäre das in SQL zu lösen. Nachdem ich irgendwann mein Argument, dass das mit SQL gar nicht möglich wäre aufgeben musste habe ich es in MySQL geschrieben. Dadurch ist der Script weit statischer (versch. Ress-/Energiesorten), doch man kann den Script ja vor dem speichern in der Datenbank durch PHP jagen, welches dann die vierte und fünfte Resssorte hinzufügt, die der Admin gerne hätte&#8230;</p>
<p>Als ich das geschafft hatte habe ich mich an einen SQL Eventhandler und eine Bauliste gemacht, die beide fast fertig sind.</p>
<p>Die Bauliste unterstützt eine Wartefunktion, die es dem Spieler erlaubt eine Liste anzulegen ohne vorher auf die Verfügbarkeit von seinen Ressourcen zu achten. Das ist leider noch nicht ganz fertig und bestimmt nicht bugfrei, aber der Ansatz steht.</p>
<p>PHP bekommt hinter dem SQL Core nurnoch die Aufgabe die Daten des Users zu validieren, zb ob er das überhaupt schon bauen darf&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/08/30/phlame-engine-ressourcenberechnung-fusionskraftwerkproblem-bauliste-mit-wartefunktion/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Phlame Engine: UGamela Tabellenumstrukturierung &amp; KS</title>
		<link>http://ugamela-blog.pheelgood.net/2008/08/26/phlame-engine-ugamela-tabellenumstrukturierung-ks/</link>
		<comments>http://ugamela-blog.pheelgood.net/2008/08/26/phlame-engine-ugamela-tabellenumstrukturierung-ks/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 15:51:55 +0000</pubDate>
		<dc:creator>Phoscur</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Phlame]]></category>
		<category><![CDATA[Phlame Engine]]></category>
		<category><![CDATA[UGamela]]></category>

		<guid isPermaLink="false">http://ugamela-blog.pheelgood.net/?p=21</guid>
		<description><![CDATA[Da bei OGame und somit UGamela jedes Schiff eines bestimmten Typs die selbe Angriffskraft hat, reichte es Flotten und Planeten mit Gebäuden in einzelnen Zeilen darzustellen, in denen jeder Typ ein Feld besitzt. Da dies unpraktikabel für Erweiterungen und vor allem für besondere Schiffe ist, werden Flotten und Planeten nun als Blöcke (mehrzeilige Tabelleneinträge) dargestellt. [...]]]></description>
			<content:encoded><![CDATA[<p>Da bei OGame und somit UGamela jedes Schiff eines bestimmten Typs die selbe Angriffskraft hat, reichte es Flotten und Planeten mit Gebäuden in einzelnen Zeilen darzustellen, in denen jeder Typ ein Feld besitzt. Da dies unpraktikabel für Erweiterungen und vor allem für besondere Schiffe ist, werden Flotten und Planeten nun als Blöcke (mehrzeilige Tabelleneinträge) dargestellt. Dies hat zum Vorteil, dass beim hinzufügen eines neuen Schiffes kein ALTER TABLE mehr ausgeführt werden muss. Zudem bekommt jedes Schiff in der Flotte spezielle Angriffs-, Verteidigungs- und Lebenswerte. Für mein Kampfsystem kommt noch ein spezieller Kampftyp dazu, der die Berechnung der Kämpfe zuerst zwischen kleinen und großen Schiffen unterteilt (Die Jäger tragen untereinander erstmal ihre eigene Schlacht aus). Zudem basiert der Kampf auf der Summenbildung des Schadens, welche einfach per MySQL SUM(`damage`*`count`)  erledigt werden kann. Im Kampf werden erst die größten Schiffe zerballert, da sie das größte Ziel bieten.</p>
<p>Resultierend aus dieser Umstrukturierung wird es auch möglich sein dem Spieler eine individuelle Schiffgestaltung zu überlassen. Dh. man könnte es beispielsweise ermöglichen bestimmte Waffen einzubauen. Dies ist vorerst allerdings nur Zukunftsmusik, ich kümmere mich vorerst nur um serverinterne Angelegenheiten und um Performance &amp; Erweiterbarkeit. Das Interface könnten danach auch ein paar Helferlein schreiben können, die nichtmal so viel davon verstehen müssten.</p>
<p>Leider ist mir heute bei einem Windoof Absturz mein SQL Ressourcen- und Eventhandlerscript abhanden gekommen, einen Großteil hatte ich mir zum Glück ausgedruckt, aber die Bauliste muss ich wohl neuschreiben, zudem muss ich einiges abtippen. Das kostet mich Zeit und regt mich auf, aber das wird schon.</p>
<p>PS: Morgen werde ich 18 <img src='http://ugamela-blog.pheelgood.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://ugamela-blog.pheelgood.net/2008/08/26/phlame-engine-ugamela-tabellenumstrukturierung-ks/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
