public void DoTerrain(int smoothness, float scale, float offset, int blur) { if (sdTerrain == null) { sdTerrain = new SquareDiamond(1024, new System.Random()); } sdTerrain.Generate(smoothness, (double)scale, InitNorthWest, InitNorth, InitWest, InitCenter); if (blur >= 3) { sdTerrain.Blur(blur); } int[] hmap = new int[1081 * 1081]; for (int y = 0; y < 1081; y++) { for (int x = 0; x < 1081; x++) { // Offset 28 px 1081-1024/2 float pt = (float)sdTerrain.Point(x - 28, y - 28); int pos = x + y * 1081; int val = (int)((pt + 1.0 + (double)offset) * 32768); val = Mathf.Clamp(val, 0, 65535); hmap[pos] = val; } } // doRiver(); byte[] map = new byte[1081 * 1081 * 2]; for (int y = 0; y < 1081; y++) { for (int x = 0; x < 1081; x++) { int pos = x + y * 1081; byte[] bytes = BitConverter.GetBytes(hmap[pos]); if (!BitConverter.IsLittleEndian) { Array.Reverse(bytes); } map[pos * 2] = bytes[0]; map[1 + pos * 2] = bytes[1]; } } SimulationManager.instance.AddAction(LoadHeightMap(map)); }
public void DoResources(int smoothness, float scale, float offset, int blur, float forestlvl, float orelvl) { if (sdResources == null) { sdResources = new SquareDiamond(512, new System.Random()); } if (RandomResourcesInit == true) { sdResources.Generate(smoothness, (double)scale, SquareDiamond.InitMode.INIT_RANDOM, SquareDiamond.InitMode.INIT_RANDOM, SquareDiamond.InitMode.INIT_RANDOM, SquareDiamond.InitMode.INIT_RANDOM); } else { sdResources.Generate(smoothness, (double)scale, InitNorthWest, InitNorth, InitWest, InitCenter); } NaturalResourceManager m = NaturalResourceManager.instance; // forest level from 0.0 to 1.0 // in reality max 0.7 (and 3 * 0.1 for other three natural resources makes 1). orelvl *= 3; forestlvl *= 0.7f; float gap = (1.0f - forestlvl) / 3; float oregap = gap * orelvl; forestlvl /= 2; for (int y = 0; y < 512; y++) { for (int x = 0; x < 512; x++) { int pos = x * 512 + y; double pt = sdResources.Point(x, y) + 1.0 / 2.0; m.m_naturalResources[pos].m_oil = 0; m.m_naturalResources[pos].m_ore = 0; m.m_naturalResources[pos].m_fertility = 0; m.m_naturalResources[pos].m_forest = 0; m.m_naturalResources[pos].m_tree = 0; if (pt < gap) { m.m_naturalResources[pos].m_fertility = 255; } else if (pt > gap + forestlvl && pt < gap + forestlvl + oregap) { m.m_naturalResources[pos].m_ore = 255; } else if (pt > gap + forestlvl + oregap + forestlvl) { m.m_naturalResources[pos].m_oil = 255; } else { m.m_naturalResources[pos].m_forest = 255; m.m_naturalResources[pos].m_tree = 120; // ?? } m.m_naturalResources[pos].m_modified = 0xff; } } }