2016-01-28 14:52:40 +01:00
|
|
|
/** @file
|
|
|
|
|
*
|
|
|
|
|
* @par History
|
|
|
|
|
* - 2006/04/09 Shinigami: added uoconvert.cfg flag ShowRoofAndPlatformWarning
|
|
|
|
|
* - 2006/05/30 Shinigami: fixed a bug with ShowRoofAndPlatformWarning - a missing expression
|
|
|
|
|
* - 2009/12/03 Turley: added gargoyle flying flag (hoverover/overflight flag)
|
|
|
|
|
*/
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2018-01-01 21:49:30 +01:00
|
|
|
#include "mapfunc.h"
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2018-10-28 10:21:31 +01:00
|
|
|
#include "../clib/bitutil.h"
|
2016-02-11 22:54:43 +01:00
|
|
|
#include "../clib/cfgelem.h"
|
|
|
|
|
#include "../clib/logfacility.h"
|
2018-01-29 21:55:48 +01:00
|
|
|
#include "mapcell.h"
|
2018-12-21 20:27:05 +01:00
|
|
|
#include "ustruct.h"
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
namespace Pol
|
|
|
|
|
{
|
|
|
|
|
namespace Plib
|
|
|
|
|
{
|
2018-12-22 00:32:47 +01:00
|
|
|
bool cfg_show_roof_and_platform_warning = true;
|
2016-02-19 19:26:35 +01:00
|
|
|
std::string flagstr( unsigned int flags )
|
|
|
|
|
{
|
|
|
|
|
std::string tmp;
|
|
|
|
|
if ( flags & FLAG::MOVELAND )
|
|
|
|
|
tmp += "L";
|
|
|
|
|
if ( flags & FLAG::MOVESEA )
|
|
|
|
|
tmp += "S";
|
|
|
|
|
if ( flags & FLAG::BLOCKSIGHT )
|
|
|
|
|
tmp += "V";
|
|
|
|
|
if ( flags & FLAG::OVERFLIGHT )
|
|
|
|
|
tmp += "f";
|
|
|
|
|
if ( flags & FLAG::ALLOWDROPON )
|
|
|
|
|
tmp += "d";
|
|
|
|
|
if ( flags & FLAG::GRADUAL )
|
|
|
|
|
tmp += "g";
|
|
|
|
|
if ( flags & FLAG::MORE_SOLIDS )
|
|
|
|
|
tmp += "+";
|
|
|
|
|
if ( flags & FLAG::BLOCKING )
|
|
|
|
|
tmp += "B";
|
|
|
|
|
if ( flags & FLAG::STACKABLE )
|
|
|
|
|
tmp += "S";
|
|
|
|
|
if ( flags & FLAG::MOVABLE )
|
|
|
|
|
tmp += "M";
|
|
|
|
|
// if (flags & FLAG::DOOR)
|
|
|
|
|
// tmp += "D";
|
|
|
|
|
if ( flags & FLAG::EQUIPPABLE )
|
|
|
|
|
tmp += "E";
|
|
|
|
|
return tmp;
|
|
|
|
|
}
|
|
|
|
|
std::string flagdescs()
|
|
|
|
|
{
|
|
|
|
|
static std::string out =
|
|
|
|
|
"L=move land, S=move sea, V=block sight, f=overflight, d=allow drop, g=gradual, +=more "
|
|
|
|
|
"solids, B=blocking, S=stackable, M=movable, E=equippable";
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u32 polflags_from_tileflags( unsigned short tile, u32 uoflags, bool use_no_shoot,
|
|
|
|
|
bool LOS_through_windows )
|
|
|
|
|
{
|
|
|
|
|
u32 mapflags = 0;
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( ( uoflags & USTRUCT_TILE::FLAG_LIQUID ) && ( uoflags & USTRUCT_TILE::FLAG_FLOOR ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::MOVESEA;
|
|
|
|
|
}
|
2018-12-22 00:32:47 +01:00
|
|
|
else if ( ( uoflags & USTRUCT_TILE::FLAG_PLATFORM ) &&
|
|
|
|
|
( ~uoflags & USTRUCT_TILE::FLAG_BLOCKING ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::MOVELAND;
|
2016-02-11 22:54:43 +01:00
|
|
|
}
|
|
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
// GRADUAL only makes sense if also STANDABLE.
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( ( mapflags & FLAG::MOVELAND ) && ( uoflags & USTRUCT_TILE::FLAG_HALF_HEIGHT ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::GRADUAL;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_HOVEROVER )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::OVERFLIGHT;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_PLATFORM )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::ALLOWDROPON;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_STACKABLE )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::STACKABLE;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_EQUIPPABLE )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::EQUIPPABLE;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_DESC_NEEDS_A )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::DESC_PREPEND_A;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_DESC_NEEDS_AN )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::DESC_PREPEND_AN;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( use_no_shoot )
|
|
|
|
|
|
|
|
|
|
{
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( ( uoflags & USTRUCT_TILE::FLAG_WALL ) &&
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
( uoflags & ( USTRUCT_TILE::FLAG_BLOCKING | USTRUCT_TILE::FLAG_DOOR ) )
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2018-01-29 21:55:48 +01:00
|
|
|
)
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
mapflags |= FLAG::BLOCKSIGHT;
|
2016-02-11 22:54:43 +01:00
|
|
|
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_NO_SHOOT )
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
mapflags |= FLAG::BLOCKSIGHT;
|
2016-02-11 22:54:43 +01:00
|
|
|
|
|
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
if ( !LOS_through_windows )
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( ( uoflags & USTRUCT_TILE::FLAG_WINDOW ) &&
|
2016-02-19 19:26:35 +01:00
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
( uoflags & USTRUCT_TILE::FLAG_WALL )
|
2016-02-19 19:26:35 +01:00
|
|
|
|
2018-01-29 21:55:48 +01:00
|
|
|
)
|
2016-02-19 19:26:35 +01:00
|
|
|
|
|
|
|
|
mapflags |= FLAG::BLOCKSIGHT;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
{
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_WINDOW )
|
2016-02-19 19:26:35 +01:00
|
|
|
|
|
|
|
|
mapflags &= ~FLAG::BLOCKSIGHT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
{
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( ( uoflags & USTRUCT_TILE::FLAG_WALL ) && ( ~uoflags & USTRUCT_TILE::FLAG_BLOCKING ) &&
|
|
|
|
|
( uoflags & USTRUCT_TILE::FLAG_DOOR ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
// example: 0xf5 secret door
|
|
|
|
|
mapflags |= FLAG::BLOCKSIGHT;
|
|
|
|
|
}
|
2018-12-22 00:32:47 +01:00
|
|
|
else if ( ( uoflags & USTRUCT_TILE::FLAG_WALL ) && ( ~uoflags & USTRUCT_TILE::FLAG_BLOCKING ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
// example: 0x245 dungeon arch
|
|
|
|
|
}
|
2018-12-22 00:32:47 +01:00
|
|
|
else if ( uoflags & ( USTRUCT_TILE::FLAG_BLOCKING | USTRUCT_TILE::FLAG_PLATFORM |
|
|
|
|
|
USTRUCT_TILE::FLAG_HALF_HEIGHT ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::BLOCKSIGHT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( Clib::flags_set( uoflags, USTRUCT_TILE::FLAG_FLOOR | USTRUCT_TILE::FLAG_LIQUID |
|
|
|
|
|
USTRUCT_TILE::FLAG_BLOCKING ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
// not blocking
|
|
|
|
|
}
|
2018-12-22 00:32:47 +01:00
|
|
|
else if ( ( uoflags & USTRUCT_TILE::FLAG_BLOCKING ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::BLOCKING;
|
|
|
|
|
}
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( uoflags & USTRUCT_TILE::FLAG_ROOF )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::BLOCKING;
|
|
|
|
|
}
|
2018-12-22 00:32:47 +01:00
|
|
|
else if ( Clib::flags_clear( uoflags, USTRUCT_TILE::FLAG_WALL ) &&
|
|
|
|
|
Clib::flags_clear( uoflags, USTRUCT_TILE::FLAG_BLOCKING ) )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
mapflags |= FLAG::MOVABLE;
|
2016-02-11 22:54:43 +01:00
|
|
|
}
|
2016-02-19 19:26:35 +01:00
|
|
|
|
|
|
|
|
// the following flags are probably not useful:
|
|
|
|
|
|
|
|
|
|
// everything allows overflight above it.
|
|
|
|
|
// mapflags |= FLAG::OVERFLIGHT;
|
|
|
|
|
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( cfg_show_roof_and_platform_warning )
|
2016-02-19 19:26:35 +01:00
|
|
|
if ( ( mapflags & FLAG::BLOCKING ) && ( mapflags & ( FLAG::MOVELAND | FLAG::MOVESEA ) ) )
|
2024-01-10 18:29:10 +01:00
|
|
|
INFO_PRINTLN( "Warning: Tile {:#x} uses Roof- and Platform-Flag at same time.", tile );
|
2016-02-19 19:26:35 +01:00
|
|
|
|
|
|
|
|
return mapflags;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u32 polflags_from_landtileflags( unsigned short tile, u32 lt_flags )
|
|
|
|
|
{
|
2018-12-22 00:32:47 +01:00
|
|
|
if ( ~lt_flags & USTRUCT_TILE::FLAG_BLOCKING )
|
2016-02-19 19:26:35 +01:00
|
|
|
{ // this seems to be the default.
|
|
|
|
|
// used to set FLOOR here only.
|
2018-12-22 00:32:47 +01:00
|
|
|
lt_flags |= USTRUCT_TILE::FLAG_PLATFORM;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
2018-12-22 00:32:47 +01:00
|
|
|
lt_flags |= USTRUCT_TILE::FLAG_FLOOR;
|
|
|
|
|
lt_flags |= USTRUCT_TILE::FLAG_HALF_HEIGHT; // the entire map is this way
|
2016-02-19 19:26:35 +01:00
|
|
|
|
|
|
|
|
unsigned int flags = polflags_from_tileflags(
|
2018-11-03 13:14:53 +01:00
|
|
|
tile, lt_flags, false, false ); // Land tiles shouldn't worry about noshoot or windows
|
2016-02-19 19:26:35 +01:00
|
|
|
return flags;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned int readflags( Clib::ConfigElem& elem )
|
|
|
|
|
{
|
|
|
|
|
bool flag_moveland = elem.remove_bool( "MoveLand", false );
|
|
|
|
|
bool flag_movesea = elem.remove_bool( "MoveSea", false );
|
|
|
|
|
bool flag_blocksight = elem.remove_bool( "BlockSight", false );
|
|
|
|
|
bool flag_overflight = elem.remove_bool( "OverFlight", true );
|
|
|
|
|
bool flag_allowdropon = elem.remove_bool( "AllowDropOn", false );
|
|
|
|
|
bool flag_gradual = elem.remove_bool( "Gradual", false );
|
|
|
|
|
bool flag_stackable = elem.remove_bool( "Stackable", false );
|
|
|
|
|
bool flag_blocking = elem.remove_bool( "Blocking", false );
|
|
|
|
|
bool flag_movable = elem.remove_bool( "Movable", false );
|
|
|
|
|
bool flag_equippable = elem.remove_bool( "Equippable", false );
|
|
|
|
|
bool flag_prepend_a = elem.remove_bool( "DescPrependA", false );
|
|
|
|
|
bool flag_prepend_an = elem.remove_bool( "DescPrependAn", false );
|
|
|
|
|
unsigned int flags = 0;
|
|
|
|
|
|
|
|
|
|
if ( flag_moveland )
|
|
|
|
|
flags |= FLAG::MOVELAND;
|
|
|
|
|
if ( flag_movesea )
|
|
|
|
|
flags |= FLAG::MOVESEA;
|
|
|
|
|
if ( flag_blocksight )
|
|
|
|
|
flags |= FLAG::BLOCKSIGHT;
|
|
|
|
|
if ( flag_overflight )
|
|
|
|
|
flags |= FLAG::OVERFLIGHT;
|
|
|
|
|
if ( flag_allowdropon )
|
|
|
|
|
flags |= FLAG::ALLOWDROPON;
|
|
|
|
|
if ( flag_gradual )
|
|
|
|
|
flags |= FLAG::GRADUAL;
|
|
|
|
|
if ( flag_stackable )
|
|
|
|
|
flags |= FLAG::STACKABLE;
|
|
|
|
|
if ( flag_blocking )
|
|
|
|
|
flags |= FLAG::BLOCKING;
|
|
|
|
|
if ( flag_movable )
|
|
|
|
|
flags |= FLAG::MOVABLE;
|
|
|
|
|
if ( flag_equippable )
|
|
|
|
|
flags |= FLAG::EQUIPPABLE;
|
|
|
|
|
if ( flag_prepend_a )
|
|
|
|
|
flags |= FLAG::DESC_PREPEND_A;
|
|
|
|
|
if ( flag_prepend_an )
|
|
|
|
|
flags |= FLAG::DESC_PREPEND_AN;
|
|
|
|
|
|
|
|
|
|
return flags;
|
|
|
|
|
}
|
2018-10-28 10:21:31 +01:00
|
|
|
} // namespace Plib
|
|
|
|
|
} // namespace Pol
|