summaryrefslogtreecommitdiffstats
path: root/AnvilStats/Statistics.cpp
diff options
context:
space:
mode:
authormadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-09-28 22:17:29 +0200
committermadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-09-28 22:17:29 +0200
commit3165458c5993a447556efbbefc5aeb4352353347 (patch)
tree89195d960927cb1f43b871d367efd7f3081ace71 /AnvilStats/Statistics.cpp
parentAnvilStats: improved speed (~5x) by caching the entire region file in the processing thread (diff)
downloadcuberite-3165458c5993a447556efbbefc5aeb4352353347.tar
cuberite-3165458c5993a447556efbbefc5aeb4352353347.tar.gz
cuberite-3165458c5993a447556efbbefc5aeb4352353347.tar.bz2
cuberite-3165458c5993a447556efbbefc5aeb4352353347.tar.lz
cuberite-3165458c5993a447556efbbefc5aeb4352353347.tar.xz
cuberite-3165458c5993a447556efbbefc5aeb4352353347.tar.zst
cuberite-3165458c5993a447556efbbefc5aeb4352353347.zip
Diffstat (limited to 'AnvilStats/Statistics.cpp')
-rw-r--r--AnvilStats/Statistics.cpp140
1 files changed, 126 insertions, 14 deletions
diff --git a/AnvilStats/Statistics.cpp b/AnvilStats/Statistics.cpp
index 6c3b61778..222b3796b 100644
--- a/AnvilStats/Statistics.cpp
+++ b/AnvilStats/Statistics.cpp
@@ -5,6 +5,7 @@
#include "Globals.h"
#include "Statistics.h"
+#include "Utils.h"
@@ -77,20 +78,42 @@ bool cStatistics::OnSection
{
for (int x = 0; x < 16; x++)
{
- unsigned char Biome = m_BiomeData[x + 16 * z]; // Cannot use cChunkDef, different data size
+ unsigned char Biome = m_BiomeData[x + 16 * z]; // Cannot use cChunkDef, different datatype
unsigned char BlockType = cChunkDef::GetBlock(a_BlockTypes, x, y, z);
- if (BlockType == 12)
- {
- __asm nop;
- }
m_BlockCounts[Biome][BlockType] += 1;
}
}
}
+
m_BlockNumChunks += m_IsFirstSectionInChunk ? 1 : 0;
m_IsFirstSectionInChunk = false;
- return true;
+ return false;
+}
+
+
+
+
+
+bool cStatistics::OnEmptySection(unsigned char a_Y)
+{
+ if (!m_IsBiomesValid)
+ {
+ // The current biome data is not valid, we don't have the means for sorting the BlockTypes into per-biome arrays
+ return true;
+ }
+
+ // Add air to all columns:
+ for (int z = 0; z < 16; z++)
+ {
+ for (int x = 0; x < 16; x++)
+ {
+ unsigned char Biome = m_BiomeData[x + 16 * z]; // Cannot use cChunkDef, different datatype
+ m_BlockCounts[Biome][0] += 16; // 16 blocks in a column, all air
+ }
+ }
+
+ return false;
}
@@ -102,13 +125,26 @@ bool cStatistics::OnSection
cStatisticsFactory::~cStatisticsFactory()
{
- // TODO: Join the results together and export
+ // Join the results together:
LOG("cStatistics:");
LOG(" Joining results...");
JoinResults();
LOG(" Total %d chunks went through", m_TotalChunks);
LOG(" Biomes processed for %d chunks", m_BiomeNumChunks);
- LOG(" BlockIDs processed for %d chunks", m_BlockNumChunks);
+
+ // Check the number of blocks processed
+ Int64 TotalBlocks = 0;
+ for (int i = 0; i <= 255; i++)
+ {
+ for (int j = 0; j < 255; j++)
+ {
+ TotalBlocks += m_BlockCounts[i][j];
+ }
+ }
+ Int64 ExpTotalBlocks = (Int64)m_BlockNumChunks * 16LL * 16LL * 256LL;
+ LOG(" BlockIDs processed for %d chunks, %lld blocks (exp %lld; %s)", m_BlockNumChunks, TotalBlocks, ExpTotalBlocks, (TotalBlocks == ExpTotalBlocks) ? "match" : "failed");
+
+ // Save statistics:
LOG(" Saving statistics into files:");
LOG(" Biomes.txt");
SaveBiomes();
@@ -158,13 +194,19 @@ void cStatisticsFactory::SaveBiomes(void)
cFile f;
if (!f.Open("Biomes.xls", cFile::fmWrite))
{
- LOG("Cannot write to file Biomes.txt. Statistics not written.");
+ LOG("Cannot write to file Biomes.xls. Statistics not written.");
return;
}
+ double TotalColumns = (double)m_BiomeNumChunks * 16 * 16; // Total number of columns processed
+ if (TotalColumns < 1)
+ {
+ // Avoid division by zero
+ TotalColumns = 1;
+ }
for (int i = 0; i <= 255; i++)
{
AString Line;
- Printf(Line, "%d\t%d\n", i, m_BiomeCounts[i]);
+ Printf(Line, "%s\t%d\t%.05f\n", GetBiomeString(i), i, m_BiomeCounts[i], ((double)m_BiomeCounts[i]) / TotalColumns);
f.Write(Line.c_str(), Line.length());
}
}
@@ -178,9 +220,15 @@ void cStatisticsFactory::SaveBlockTypes(void)
cFile f;
if (!f.Open("BlockTypes.xls", cFile::fmWrite))
{
- LOG("Cannot write to file Biomes.txt. Statistics not written.");
+ LOG("Cannot write to file Biomes.xls. Statistics not written.");
return;
}
+ double TotalBlocks = ((double)m_BlockNumChunks) * 16 * 16 * 256 / 100; // Total number of blocks processed
+ if (TotalBlocks < 1)
+ {
+ // Avoid division by zero
+ TotalBlocks = 1;
+ }
for (int i = 0; i <= 255; i++)
{
int Count = 0;
@@ -189,7 +237,7 @@ void cStatisticsFactory::SaveBlockTypes(void)
Count += m_BlockCounts[Biome][i];
}
AString Line;
- Printf(Line, "%d\t%d\n", i, Count);
+ Printf(Line, "%s\t%d\t%d\t%.08f\n", GetBlockTypeString(i), i, Count, ((double)Count) / TotalBlocks);
f.Write(Line.c_str(), Line.length());
}
// TODO
@@ -201,8 +249,72 @@ void cStatisticsFactory::SaveBlockTypes(void)
void cStatisticsFactory::SaveBiomeBlockTypes(void)
{
- LOG("Not implemented yet!");
- // TODO
+ // Export as two tables: biomes 0-127 and 128-255, because OpenOffice doesn't support more than 256 columns
+ cFile f;
+ if (!f.Open("BiomeBlockTypes.xls", cFile::fmWrite))
+ {
+ LOG("Cannot write to file BiomeBlockTypes.xls. Statistics not written.");
+ return;
+ }
+
+ AString FileHeader("Biomes 0-127:\n");
+ f.Write(FileHeader.c_str(), FileHeader.length());
+
+ AString Header("BlockType\tBlockType");
+ for (int Biome = 0; Biome <= 127; Biome++)
+ {
+ const char * BiomeName = GetBiomeString(Biome);
+ if ((BiomeName != NULL) && (BiomeName[0] != 0))
+ {
+ AppendPrintf(Header, "\t%s (%d)", BiomeName, Biome);
+ }
+ else
+ {
+ AppendPrintf(Header, "\t%d", Biome);
+ }
+ }
+ Header.append("\n");
+ f.Write(Header.c_str(), Header.length());
+
+ for (int BlockType = 0; BlockType <= 255; BlockType++)
+ {
+ AString Line;
+ Printf(Line, "%s\t%d", GetBlockTypeString(BlockType), BlockType);
+ for (int Biome = 0; Biome <= 127; Biome++)
+ {
+ AppendPrintf(Line, "\t%d", m_BlockCounts[Biome][BlockType]);
+ }
+ Line.append("\n");
+ f.Write(Line.c_str(), Line.length());
+ }
+
+ Header.assign("\n\nBiomes 127-255:\nBlockType\tBlockType");
+ for (int Biome = 0; Biome <= 127; Biome++)
+ {
+ const char * BiomeName = GetBiomeString(Biome);
+ if ((BiomeName != NULL) && (BiomeName[0] != 0))
+ {
+ AppendPrintf(Header, "\t%s (%d)", BiomeName, Biome);
+ }
+ else
+ {
+ AppendPrintf(Header, "\t%d", Biome);
+ }
+ }
+ Header.append("\n");
+ f.Write(Header.c_str(), Header.length());
+
+ for (int BlockType = 0; BlockType <= 255; BlockType++)
+ {
+ AString Line;
+ Printf(Line, "%s\t%d", GetBlockTypeString(BlockType), BlockType);
+ for (int Biome = 128; Biome <= 255; Biome++)
+ {
+ AppendPrintf(Line, "\t%d", m_BlockCounts[Biome][BlockType]);
+ }
+ Line.append("\n");
+ f.Write(Line.c_str(), Line.length());
+ }
}