[os-devel] SF.net SVN: ospace:[315] branches/ospace_0.5
Brought to you by:
qark
From: <da...@us...> - 2011-11-07 17:19:49
|
Revision: 315 http://ospace.svn.sourceforge.net/ospace/?rev=315&view=rev Author: dahaic Date: 2011-11-07 17:19:42 +0000 (Mon, 07 Nov 2011) Log Message: ----------- - Galaxy booking system now generates galaxies with random placement. [dahaic] Modified Paths: -------------- branches/ospace_0.5/ChangeLog.txt branches/ospace_0.5/server/lib/ige/ospace/GalaxyGenerator.py branches/ospace_0.5/server/lib/ige/ospace/IUniverse.py branches/ospace_0.5/server/run_galaxer.py Modified: branches/ospace_0.5/ChangeLog.txt =================================================================== --- branches/ospace_0.5/ChangeLog.txt 2011-11-06 13:17:56 UTC (rev 314) +++ branches/ospace_0.5/ChangeLog.txt 2011-11-07 17:19:42 UTC (rev 315) @@ -6,6 +6,9 @@ - $Author$ - $Revision$ +[2011-11-07] +- Galaxy booking system now generates galaxies with random placement. [dahaic] + [2011-11-06] - Mutant may, from now on, deploy on a free planets of the system owned by someone else. [dahaic] - AI from now on checks, whether the build jobs target a non-other-player planets (ie. no more building on neighbours planets) [dahaic] Modified: branches/ospace_0.5/server/lib/ige/ospace/GalaxyGenerator.py =================================================================== --- branches/ospace_0.5/server/lib/ige/ospace/GalaxyGenerator.py 2011-11-06 13:17:56 UTC (rev 314) +++ branches/ospace_0.5/server/lib/ige/ospace/GalaxyGenerator.py 2011-11-07 17:19:42 UTC (rev 315) @@ -158,8 +158,8 @@ class GalaxyGenerator: def __init__(self): - self.galaxyTypes = {'Circle9P':(9, 'Smaller galaxy for 9 players, without pirate or EDEN. Recommended for new players or those who seek more casual gameplay.'), - 'Circle42P':(42, 'Original size galaxy for 42 players, place of epic battles, recommended only to the experienced players. May be quite time consuming.')} + self.galaxyTypes = {'Circle9P':(9, 'Smaller galaxy for 9 players, without pirate or EDEN. Recommended for new players or those who seek more casual gameplay.', 26.0), + 'Circle42P':(42, 'Original size galaxy for 42 players, place of epic battles, recommended only to the experienced players. May be quite time consuming.', 50.0)} def generateGalaxy(self, galaxyType, fileHandle): if not galaxyType in self.galaxyTypes.keys(): Modified: branches/ospace_0.5/server/lib/ige/ospace/IUniverse.py =================================================================== --- branches/ospace_0.5/server/lib/ige/ospace/IUniverse.py 2011-11-06 13:17:56 UTC (rev 314) +++ branches/ospace_0.5/server/lib/ige/ospace/IUniverse.py 2011-11-07 17:19:42 UTC (rev 315) @@ -411,6 +411,7 @@ getReferences.public = 0 + # TODO remove it as soon as having a standalone galaxy generator def getPossibleGalaxyTypes(self, tran, obj): galGen = GalaxyGenerator.GalaxyGenerator() return galGen.getGalaxyTypes() Modified: branches/ospace_0.5/server/run_galaxer.py =================================================================== --- branches/ospace_0.5/server/run_galaxer.py 2011-11-06 13:17:56 UTC (rev 314) +++ branches/ospace_0.5/server/run_galaxer.py 2011-11-07 17:19:42 UTC (rev 315) @@ -19,8 +19,10 @@ # import atexit +import math import optparse import os +import random import sys import time import xmlrpclib @@ -106,7 +108,7 @@ if session: playerNick = session.nick for galType in types: - playerCapacity, infoText = types[galType] + playerCapacity, infoText, radius = types[galType] query = db.execute('SELECT COUNT(*), galType\ FROM players GROUP BY galType\ HAVING galType=?', (galType,)).fetchone() @@ -136,27 +138,31 @@ GROUP BY galType', ()).fetchall() types = s.getPossibleGalaxyTypes(OID_UNIVERSE) for galType, count in query: - galCap, galInfo = types[galType] - if galCap * options.threshold <= count: - # - return createNewGalaxy(galType, galCap) + galCap, galInfo, radius = types[galType] + if galCap * options.threshold <= count: + return createNewGalaxy(galType, galCap, radius) -def createNewGalaxy(galType, galCap): +def createNewGalaxy(galType, galCap, radius): actualGalaxies = _getActualGalaxies() - galPositions = set([]) + # using sqlite to provide rtree, as it is part of the standard library + tempdb = sqlite3.connect(':memory:') + tempdb.execute('CREATE VIRTUAL TABLE galaxies_positions USING rtree(id INTEGER PRIMARY KEY, x_min, x_max, y_min, y_max)') galNames = set([]) - maxCoordinate = 0 - names = ['Argo', 'Beidos', 'Ceelia', 'Daela', 'Everen', 'Ferun', 'Garis', 'Hiron', 'Inera', 'Jinx', 'Kelenor', 'Larion', 'Merlis'] + maxRadius = radius + # reserve is half of the minimal range of the galaxies + reserve = 50.0 + galRadius = radius + reserve + # fill list of possible galaxy names + names = [] + for name in open('data/GalaxyNames.txt'): + names.append(name.strip()) for galaxyID in actualGalaxies: galName, galX, galY, galRadius = actualGalaxies[galaxyID] - galX = int(galX) - galY = int(galY) - galRadius = int(galRadius) + maxRadius = max(maxRadius, galRadius) + galRadius += reserve galNames.add(galName) - galPositions.add((galX, galY)) - maxCoordinate = max(maxCoordinate, galX, galY) - if galRadius > 50 or galX % 100 or galY % 100: - raise NotImplementedError + tempdb.execute('INSERT INTO galaxies_positions VALUES (?, ?, ?, ?, ?)', + (galaxyID, galX-galRadius, galX+galRadius, galY-galRadius, galY+galRadius)) # get list of booked players, and delete # their records from the booking system query = db.execute('SELECT login, nick, email FROM players\ @@ -170,21 +176,21 @@ WHERE nick=?', (nick,)) # now we need to find the place for it - squareSide = maxCoordinate / 200 + 1 - if squareSide**2 == len(actualGalaxies): - squareSide += 1 - hasFound = False - for y in xrange(squareSide): - posY = y * 200 + 100 - for x in xrange(squareSide): - posX = x * 200 + 100 - if (posX, posY) in galPositions: - continue - hasFound = True - if hasFound: - break - if hasFound: - break + search = True + # we don't want to have negative coordinates + lowLimit = int(math.ceil(radius)) + # surface of biggest galaxy is multiplied by number of galaxies to get + # filled surface. By adding the surface of new galaxy, we get the surface of + # hypothetical square. 4.4 is magic constant that multiply length of side to + # ensure that the new galaxy will fit in all cases (actually 4.3 should be + # sufficient according to 10000 run Monte Carlo simulation) + highLimit = int(math.ceil(((maxRadius ** 2 ) * len(actualGalaxies) + galRadius ** 2) ** 0.5 * 4.4 + radius)) + while search: + posX = random.randrange(lowLimit, highLimit) + posY = random.randrange(lowLimit, highLimit) + search = bool(tempdb.execute('SELECT id FROM galaxies_positions WHERE\ + x_min<? AND x_max>? AND y_min<? AND y_max>?', + (posX+galRadius, posX-galRadius, posY+galRadius, posY-galRadius)).fetchall()) # searching for free name for the galaxy nameFound = False for name in names: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |