From 3165458c5993a447556efbbefc5aeb4352353347 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Fri, 28 Sep 2012 20:17:29 +0000 Subject: AnvilStats: complete per-biome blocktype statistics git-svn-id: http://mc-server.googlecode.com/svn/trunk@897 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- AnvilStats/Statistics.cpp | 140 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 126 insertions(+), 14 deletions(-) (limited to 'AnvilStats/Statistics.cpp') 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()); + } } -- cgit v1.2.3