using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LifeSimulation.Extensions
{
static class AppStateExtension
{
#region Extension methods
public static void Spawn(this AppState appState, bool random)
{
if (random)
appState.CreateRandomLife(10);
else
appState.CreateLifeAtCentre();
}
public static void SpawnBlob(this AppState appState, int x, int y, int size)
{
//Round object
int mi = appState.World.Space.GetLength(0) - 1;
int mj = appState.World.Space.GetLength(1) - 1;
for (int i = x - size; i <= x + size; i++)
for (int j = y - size; j <= y + size; j++)
{
if (i > 0 && i < mi && j > 0 && j < mj)
if (Math.Sqrt((i - x) * (i - x) + (j - y) * (j - y)) <= size)
appState.World.Space[i, j] = appState.LifeModel.MaximumAge;
}
}
#endregion
#region Private methods
private static void CreateLifeAtCentre(this AppState appState)
{
appState.CreateLifeBlossom(
appState.World.Space.GetLength(0) / 2,
appState.World.Space.GetLength(1) / 2
);
}
private static void CreateRandomLife(this AppState appState, int num)
{
for (int i = 0; i < num; i++)
appState.CreateRandomLife();
}
private static void CreateRandomLife(this AppState appState)
{
int i = appState.Rnd.Next(appState.World.Space.GetLength(0));
int j = appState.Rnd.Next(appState.World.Space.GetLength(1));
appState.CreateLifeBlossom(i, j);
}
private static void CreateLifeBlossom(this AppState appState, int i, int j)
{
int max = appState.LifeModel.MaximumAge;
appState.CreateLife(i, j, 3, max / 3); //Block
appState.CreateLife(i, j, 4, max / 2); //Vertical line
appState.CreateLife(i, j, 5, max / 2); //Horizontal line
appState.CreateLife(i - 4, j - 4, 1, max); //Spot
appState.CreateLife(i - 4, j + 4, 1, max); //Spot
appState.CreateLife(i + 4, j + 4, 1, max); //Spot
appState.CreateLife(i + 4, j - 4, 1, max); //Spot
appState.CreateLife(i - 5, j - 5, 1, max); //Spot
appState.CreateLife(i - 5, j + 5, 1, max); //Spot
appState.CreateLife(i + 5, j + 5, 1, max); //Spot
appState.CreateLife(i + 5, j - 5, 1, max); //Spot
}
private static void CreateLife(this AppState appState, int i, int j, int type, int age)
{
int mi = appState.World.Space.GetLength(0) - 1;
int mj = appState.World.Space.GetLength(1) - 1;
switch (type)
{
case 1: //Spot
if (i > 0 && i < mi && j > 0 && j < mj)
appState.World.Space[i, j] = age;
break;
case 2: //Star
appState.World.Space[i, j] = age;
if (i > 0) appState.World.Space[i - 1, j] = age;
if (i < mi) appState.World.Space[i + 1, j] = age;
if (j > 0) appState.World.Space[i, j - 1] = age;
if (j < mj) appState.World.Space[i, j + 1] = age;
break;
case 3: //Block
for (int ii = i - 2; ii <= i + 2; ii++)
for (int jj = j - 2; jj <= j + 2; jj++)
if (ii > 0 && ii < mi && jj > 0 && jj < mj)
appState.World.Space[ii, jj] = age;
break;
case 4: //Vertical line
for (int jj = j - 4; jj <= j + 4; jj++)
if (jj > 0 && jj < mj)
appState.World.Space[i, jj] = age;
break;
case 5: //Horizontal line
for (int ii = i - 4; ii <= i + 4; ii++)
if (ii > 0 && ii < mi)
appState.World.Space[ii, j] = age;
break;
}
}
#endregion
}
}