AnvilStats: complete per-biome blocktype statistics
git-svn-id: http://mc-server.googlecode.com/svn/trunk@897 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user