# pragma region License
/*
License ( OLC - 3 )
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Copyright 2024 Joshua Sigona < sigonasr2 @ gmail . com >
Redistribution and use in source and binary forms , with or without modification ,
are permitted provided that the following conditions are met :
1. Redistributions or derivations of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice . This list of conditions and the following disclaimer must be
reproduced in the documentation and / or other materials provided with the distribution .
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND ANY
EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT ,
INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED
TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR
BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE .
Portions of this software are copyright © 2023 The FreeType
Project ( www . freetype . org ) . Please see LICENSE_FT . txt for more information .
All rights reserved .
*/
# pragma endregion
# pragma once
# include "olcUTIL_Geometry2D.h"
# include <set>
# include "TMXParser.h"
struct XMLTag ;
using MapName = std : : string ;
class MapHelper {
public :
static Map & MapFromString ( std : : string mapName ) ;
} ;
struct TileCollisionData {
geom2d : : rect < float > collision ;
} ;
struct TilesetData {
Renderable * tileset = nullptr ;
int tilewidth = 0 , tileheight = 0 ;
bool isTerrain = false ;
std : : map < int , XMLTag > foregroundTiles ;
std : : map < int , XMLTag > upperForegroundTiles ;
std : : map < float , TileCollisionData > collision ;
std : : map < int , XMLTag > staircaseTiles ;
std : : map < int , std : : vector < int > > animationData ;
std : : set < int > reflectiveData ;
} ;
struct TilesheetData {
TilesetData * tileset ;
int firstgid ;
bool operator = = ( const TilesheetData & rhs ) {
return tileset = = rhs . tileset & & firstgid = = rhs . firstgid ;
}
} ;
struct TileRenderData {
TilesheetData tileSheet ;
vf2d pos ;
vi2d tileSheetPos ;
int tileID ;
int layerID ;
float tileOpacity ;
bool operator = = ( const TileRenderData & rhs ) {
return tileSheet = = rhs . tileSheet & & pos = = rhs . pos & & tileSheetPos = = rhs . tileSheetPos
& & tileID = = rhs . tileID & & layerID = = rhs . layerID ;
}
} ;
struct TileGroup {
private :
geom2d : : rect < int > range ;
std : : vector < TileRenderData > tiles ;
int minX = 0 , minY = 0 , maxX = 0 , maxY = 0 ;
public :
static float FADE_TIME ;
//0-255. 255 indicates fully invisible.
static uint8_t FADE_AMT ;
geom2d : : rect < int > GetRange ( ) ;
//The fade range is the bounds in which this tile group will be considered "in range" of a player, one tile in each direction further than its actual range.
geom2d : : rect < int > GetFadeRange ( ) ;
std : : vector < TileRenderData > & GetTiles ( ) ;
void InsertTile ( TileRenderData tile ) ;
bool playerBehind = false ;
float fadeFactor = 0.f ;
} ;