Home World Forum
Stars! AutoHost web forums

Jump to Stars! AutoHost


 
 
Home » Stars! 2.6/7 » The Academy » Problem with randomness in planet distrtibution
Re: Problem with randomness in planet distrtibution Sun, 14 October 2007 14:16 Go to previous messageGo to previous message
ck_drknes is currently offline ck_drknes

 
Crewman 2nd Class

Messages: 17
Registered: May 2007
Location: Why do you want to know?
Alright, spent a little time optimizing it and making it easier to read. It now takes 0.631 sec to gen a 4000 by 3000 map with 16 HW (in flash Very Happy ). The spacing is also now much better.

heres the pic:
[img]http://www.chasekernan.com/flashNovaMap2.gif[/img]

I also re-uploaded the actual app in case you want to see it.

Heres the better code (put some stuff in funcs so its a bit easier to read and shorter):
public function generateRectMap(dimensions:Vector, numberOfPlanets:uint, players:Array, names:Array, germanium:int = -1):void
		{
			_objects	=	[];
			//removed the checks because they're the same from above
			
			//randomize player and name order
			players						=	randomizeArray(players);
			names						=	randomizeArray(names);
					
			var planetPoints	:Array	=	createPoints(dimensions, numberOfPlanets, 0.05);
			
			for(i = 0; i < planetPoints.length; i ++)
				_objects.push(new Planet(planetPoints[i], names[i]));
			
			var hwPoints		:Array	=	createPoints(dimensions, players.length, 0.2);
			
			for(i = 0; i < hwPoints.length; i++)
			{
				//hw loc
				var point		:Vector	=	hwPoints[i] as Vector;
				
				//find closest planet
				var dist		:Number	=	_objects[0].Location.getDistance(point);
				var curDist		:Number	=	0;
				var planetNum	:int	=	0;
				
				for(var j:int = 0; j < _objects.length; j++)
				{
					curDist				=	_objects[j].Location.getDistance(point);
					if(curDist < dist)
					{
						dist			=	curDist;
						planetNum		=	j;
					}
				}
				
				//found the planet so now change it to HW
				var planet		:Planet	=	_objects[planetNum] as Planet;
				var player		:Player	=	players[i] as Player;
				
				//probably don't want to have this hardcoded.
				planet.IsHomeworld		=	true;
				planet.Owner			=	player;
				planet.Environment		=	player.PlayerRace.PerfectEnv;
				planet.MinConcentrations.Germanium	=	germanium;
				planet.Population		=	player.PlayerRace.GrowthRate * 5000 + 50000;
				planet.Factories		=	10;
				planet.Mines			=	10;
			}
		}
		
		private function createPoints(dimensions:Vector, numberOfPoints:int, borderPercent:Number):Array
		{
			var points		:Array	=	[];
			var sqrt		:int	=	Math.ceil(Math.sqrt(numberOfPoints));
			var plotSize	:Vector	=	new Vector(dimensions.x / sqrt, dimensions.y / sqrt);
			var excessPlots	:int	=	int(sqrt * sqrt - numberOfPoints);
			var border		:Number	=	borderPercent * Math.min(plotSize.x, plotSize.y);
			
			//remove excess
			var randomIntX		:int;
			var randomIntY		:int;
			var remove			:Array	=	[];
			//setup array
			for(var i:int = 0; i < sqrt; i++) 
			{
				remove[i]	=	[];
				for(var j:int = 0; j < sqrt; j++) remove[i][j]=	1;
			}
			
			//remove extra
			for(i = 0; i < excessPlots; i++)
			{
				do {
					randomIntX			=	int(Math.random() * (sqrt - 0.0001));
					randomIntY			=	int(Math.random() * (sqrt - 0.0001));
				} while (remove[randomIntX][randomIntY] == 0);
				remove[randomIntX][randomIntY] = 0;
			}
			
			//setup actual points
			for(i = 0; i < sqrt; i++)
			{
				for(j = 0; j < sqrt; j++)
				{
					if(remove[i][j] == 0) continue;
					
					var xloc	:int	=	i * plotSize.x + border + Math.random() * (plotSize.x - border * 2);
					var yloc	:int	=	j * plotSize.y + border + Math.random() * (plotSize.y - border * 2);
					
					points.push(new Vector(xloc, yloc));
				}
			}
			return points;
		}
		
		private function randomizeArray(a:Array):Array
		{
			var newA	:Array	=	[];
			for(var i:int = a.length - 1; i >= 0; i--) 
				newA.push(a.splice(Math.floor(Math.random() * (a.length - 0.0001)), 1)[0]);
				
			return newA;
		}

Report message to a moderator

 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: Sapping Cruisers
Next Topic: Installations destroyed by bombing
Goto Forum:
  


Current Time: Tue Jun 04 11:12:01 EDT 2024