Dokumentation zum Massive Multiplayer Online Game - Universität ...
Dokumentation zum Massive Multiplayer Online Game - Universität ...
Dokumentation zum Massive Multiplayer Online Game - Universität ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
2. Planeten und Gebäude<br />
9<br />
def self.generateNear(x, y)<br />
3.times do |m|<br />
3.times do |n|<br />
generateAt(x - 1 + m, y - 1 + n)<br />
end<br />
end<br />
end<br />
Sobald mindestens eine Galaxie erzeugt wird, müssen auch alle zugehörigen Sonnensysteme und Planeten<br />
in einer einzigen Transaktion miterzeugt werden. Dadurch wird gewährleistet, dass die Weltdaten in der<br />
Datenbank konsistent mit den Spielregeln einhergehen. Konnte eine Galaxie nicht erzeugt werden, ist das kein<br />
Problem, da automatisch beim nächsten Aufruf an einer benachbarten Galaxie diese Galaxie erneut erzeugt<br />
werden kann. Insgesamt wird durch dieses Vorgehen gewährleistet, dass immer genug der Spielwelt als "neues<br />
Gebiet" zur Verfügung steht, aber nicht sehr viel auf einmal in die Datenbank eingetragen werden muss. Die<br />
einzelnen Generierungen der umgebenen Galaxien dauert zwischen 10 ms und 900 ms, je nachdem, wie viel<br />
nachgeneriert werden muss.<br />
Bei jedem Erstellen eines neuen Sonnensystems wird darauf geachtet, dass genau ein Planet als Startplanet<br />
für neue User erzeugt wird und alle anderen als spezialisierte Planeten mit besonderen Eigenschaften. Da wir<br />
festgelegt hatten, dass ein User ca. 4-5 Planeten verwalten würde, haben wir uns dazu entschlossen, bei<br />
Sonnensystemen, die 7 oder 8 Planeten erstellen, zusätzlich einen zweiten Planeten als Startplaneten zu<br />
deklarieren. Das führt dazu, dass User in großen Sonnensystemen automatisch zu mehr Interaktionen mit<br />
anderen Usern gezwungen sind und nicht übervorteilt sind. Im Gegenzug ist es zur Spielregel geworden, dass<br />
die Übernahme eines Startplaneten nicht mehr möglich ist, sobald ein User diesen Planeten besitzt. Dadurch<br />
werden die Startplaneten zu strategischen Punkten im Spiel und gleichen den Nachteil aus, dass sie keine<br />
Besonderheit aufweisen.<br />
Startplaneten an neue User zuweisen<br />
Damit ein neuer User beim Spiel teilnehmen kann, muss er einen Startplaneten zugewiesen bekommen. Dazu<br />
haben wir eine Hilfsmethode erstellt, die für einen übergebenen User einen Startplaneten sucht. Auf die<br />
Möglichkeit, einfach irgendeinen Startplaneten zufällig zu wählen, wollten wir verzichten, da dies dem Spielprinzip<br />
nicht förderlich ist. Eine zufällige Zuweisung würde dazu führen, dass User am Anfang sehr weit voneinander<br />
entfernt sein können, und zwar so weit, dass der <strong>Multiplayer</strong>aspekt für sehr lange Zeit nicht <strong>zum</strong> Tragen kommen<br />
würde. Stattdessen sollten die User zwar relativ zufällig, aber doch ziemlich nah beieinander starten. Aufgrund<br />
der dynamischen Generierung der Welt ist dies sehr einfach:<br />
Auszug aus dem Modul PlanetsHelper<br />
@@marker = []<br />
@@marker_pos = 0<br />
def self.search_startplanet()<br />
if @@marker.nil? || @@marker.length < 8 then<br />
@@marker = Planet.where(special: 0, user_id: nil).limit(8)<br />
end<br />
return false if @@marker.empty?<br />
@@marker_pos = (@@marker_pos+1) % 8<br />
planet = @@marker[@@marker_pos]<br />
@@marker[@@marker_pos] = nil<br />
@@marker.compact!<br />
return planet<br />
end<br />
def self.claim_startplanet_for(user)<br />
return false if !user.is_a?User || user.nil? || user.planets.count > 0<br />
p = search_startplanet<br />
if !p.nil? && p.is_a?(Planet) && p.user.nil?<br />
p.claim(user)<br />
p.set_home_planet(user)<br />
return true<br />
else<br />
return false