polserver/pol-core/plib/uofile04.cpp
turleypol 43b776b94d
New format lib version (#592)
* renamed include guard to be able to use both format lib versions in
parallel

* build Fmt lib and link it into clib

* use std::string instead of format Writer for logging
added variant "2" for logging with new fmt lib

* use new logging variant for two logs

* always add \n to flush log, lets see if the assumption holds

* use new lib for tostring

* replaced all INFO_PRINTS in clib

* formatter for Token, BObject and BObjectImp

* started with bsccript

* use function instead of actual object for logging

* remaining bscript, started plib

* logvariant without newline added, more template magic

* format support for base types, added test for format padding
new version for fdump

* chanhed ecompile/runecl fixed compilation with ESCRIPT_PROFILE

* rewrite INFO_PRINT in plib,poltool/uoconvert/uotool

* replaced remaining INFO_PRINTS, renamed macros INFO_PRINT for logging
without newline, INFO_PRINTLN for newline addition.
Replaced also INFO_PRINT_TRACE and renamed it to INFO_PRINTLN_TRACE

* gitignore for fmt lib

* cleanup vim leftovers
2024-01-10 18:29:10 +01:00

63 lines
1.4 KiB
C++

/** @file
*
* @par History
*/
#include <set>
#include <stdio.h>
#include "../clib/logfacility.h"
#include "../clib/rawtypes.h"
#include "uofilei.h"
#include "ustruct.h"
namespace Pol
{
namespace Plib
{
std::set<unsigned int> water;
bool iswater( u16 objtype )
{
return ( objtype >= 0x1796 && objtype <= 0x17b2 );
}
void readwater()
{
USTRUCT_IDX idxrec;
fseek( sidxfile, 0, SEEK_SET );
for ( int xblock = 0; xblock < 6144 / 8; ++xblock )
{
INFO_PRINT( "{}..", xblock );
for ( int yblock = 0; yblock < 4096 / 8; ++yblock )
{
if ( fread( &idxrec, sizeof idxrec, 1, sidxfile ) != 1 )
throw std::runtime_error( "readwater: fread(idxrec) failed." );
int xbase = xblock * 8;
int ybase = yblock * 8;
if ( idxrec.length != 0xFFffFFffLu )
{
fseek( statfile, idxrec.offset, SEEK_SET );
for ( idxrec.length /= 7; idxrec.length > 0; --idxrec.length )
{
USTRUCT_STATIC srec;
if ( fread( &srec, sizeof srec, 1, statfile ) != 1 )
throw std::runtime_error( "readwater: fread(srec) failed." );
if ( srec.z == -5 && iswater( srec.graphic ) )
{
int x = xbase + srec.x_offset;
int y = ybase + srec.y_offset;
unsigned int xy = x << 16 | y;
water.insert( xy );
}
}
}
}
}
}
} // namespace Plib
} // namespace Pol