You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ryzom-core/ryzom/client/src/continent.h

333 lines
7.2 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CL_CONTINENT_H
#define CL_CONTINENT_H
/////////////
// INCLUDE //
/////////////
// Misc
#include "nel/misc/types_nl.h"
#include "nel/misc/vector.h"
#include "nel/misc/rgba.h"
// Game share
#include "game_share/season.h"
#include "game_share/dir_light_setup.h"
// Client sheets
#include "client_sheets/continent_sheet.h"
//
#include "streamable_entity_composite.h"
#include "fog_map.h"
#include "game_share/fog_of_war.h"
#include "game_share/fog_type.h"
#include "game_share/time_weather_season/weather_function.h"
#include "sky_material_setup.h"
#include "outpost.h"
//
#include "sky.h" // new style sky
//
#include "water_map.h"
#include "continent_manager_build.h"
struct IIGEnum;
struct IIGAdded;
///////////
// CLASS //
///////////
namespace NLMISC
{
class CVectorD;
class IProgressCallback;
}
namespace NL3D
{
class UDriver;
}
struct CFogState;
// Landmark created by the user
class CUserLandMark
{
public:
enum EUserLandMarkType
{
Misc = 0,
Tribe,
Bandit,
Citizen,
Fauna,
FaunaExcel,
FaunaSup,
Forage,
ForageExcel,
ForageSup,
Sap,
Amber,
Node,
Fiber,
Bark,
Seed,
Shell,
Resin,
Wood,
Oil,
Mission,
Food,
Construction,
Goo,
Insect,
Kitin,
Nocive,
Preservative,
Passage,
Teleporter,
UserLandMarkTypeCount
};
NLMISC::CVector2f Pos; // Pos in local map
ucstring Title; // FIXME: UTF-8 (serial)
uint8 Type;
//User LandMarks Colors
static NLMISC::CRGBA _LandMarksColor[UserLandMarkTypeCount];
public:
CUserLandMark()
{
Type = Misc;
}
/// Get user landmark color
NLMISC::CRGBA getColor () const;
void serial(NLMISC::IStream &f)
{
f.serial(Pos, Title, Type);
}
};
/**
* Class to manage the fog of war over a continent
* \author Matthieu 'Trap' Besson
* \author Nevrax France
* \date June 2004
*/
class CFogOfWar : public IFogOfWar
{
public:
NL3D::UTextureMem *Tx; // Here store the real size
public:
CFogOfWar()
{
Tx = NULL;
}
~CFogOfWar();
void load(const std::string &contName);
void save(const std::string &contName);
// Implementation of IFogOfWar
virtual uint8 *getData();
virtual bool createData(sint16 w, sint16 h);
virtual void explored(sint16 mapPosX, sint16 mapPosY);
virtual sint16 getRealWidth();
virtual sint16 getRealHeight();
};
/**
* Class to manage a continent.
* \author Guillaume PUZIN (GUIGUI)
* \author Nevrax France
* \date 2001
*/
class CContinent : public CContinentParameters
{
public:
// name of the sheet used to create the continent
std::string SheetName;
// backup setup of sky for day
CSkyMaterialSetup DaySkySetup;
// backup setup of sky for day
CSkyMaterialSetup NightSkySetup;
// Fog map
CFogMap FogMap;
// Water map
CWaterMap WaterMap;
// Selected season
EGSPD::CSeason::TSeason Season;
// A group of village
CStreamableEntityComposite _Villages;
// A group of outposts
std::vector<COutpost> _Outposts;
// The current sky
CSky CurrentSky;
// Weather functions for each season
CWeatherFunction WeatherFunction[EGSPD::CSeason::Invalid];
// user landmarks (saved)
std::vector<CUserLandMark> UserLandMarks;
// continent landmarks (not saved but static data)
std::vector<CContLandMark> ContLandMarks;
// Continent occupation zone
NLLIGO::CPrimZone Zone;
// Center of the occupation zone
NLMISC::CVector2f ZoneCenter;
// bool Newbie;
CFogOfWar FoW;
public:
/// Constructor
CContinent();
/// setup the continent from a sheet (use the SheetName that MUST be set)
void setup();
/**
* Update global parameters like the texture for the micro veget.
*/
void select(const NLMISC::CVectorD &pos, NLMISC::IProgressCallback &progress, bool complete, bool unhibernate, EGSPD::CSeason::TSeason season);
/// This will remove extra rsc used by the continent (fog maps ..)
void unselect();
/** Test whether the next call to updateStreamable will be blocking.
* This happen for example when the player is too near of a village and when asynchronous loading is not sufficient.
* \param pos player position
*/
bool isLoadingforced(const NLMISC::CVector &playerPos) const;
/** Given the position of the player, load / unload objects (asynchronously when possible)
*/
void updateStreamable(const NLMISC::CVector &playerPos);
/** Given the position of the player, load / unload objects (always in a synchronous fashion)
*/
void forceUpdateStreamable(const NLMISC::CVector &playerPos, NLMISC::IProgressCallback &progress);
/** Remove all villages from the continents
*/
void removeVillages();
// Get a outpost
COutpost *getOutpost (uint i);
// get fog
void getFogState(TFogType fogType, float dayNight, float duskRatio, CLightCycleManager::TLightState lightState, const NLMISC::CVectorD &pos, CFogState &result, bool overideByWeatherFogDist = true);
/** Enum ig of the continent
* (for now, these are currently instanciated villages)
* \return false if the enumeration has been stopped
*/
bool enumIGs(IIGEnum *callback);
///\name ig added observers.
//@{
void registerObserver(IIGObserver *obs);
void removeObserver(IIGObserver *obs);
bool isObserver(IIGObserver *obs) const;
//@}
// load (or reload) the micro-life primitives
void loadMicroLife();
// init the water map
void initWaterMap();
/** get corners min / zone max
* \return true if success
*/
bool getCorners(NLMISC::CVector2f &cornerMin, NLMISC::CVector2f &cornerMax) const;
// dump village loading zones in a bitmap
void dumpVillagesLoadingZones(const std::string &filename);
enum TChannel { ChannelR = 0, ChannelG = 1, ChannelB = 2, ChannelA = 3, ChannelRGBA };
// dump fog map, blended with continent map, and with camera pos
// If a single channel is used, then channelLookup is used pick up the final color
void dumpFogMap(CFogMapBuild::TMapType mapType, const std::string &filename, TChannel channel = ChannelRGBA, const CRGBA channelLookup[256] = NULL);
void reloadFogMap();
// init release the sky
void initSky();
void releaseSky();
/// Return the max number of user landmarks (standard + bonus ones)
static uint getMaxNbUserLandMarks();
private:
// Register outpost (collsions...)
void initOutpost();
// Remove all outpost (collisions...)
void removeOutpost();
// load the fog maps
bool loadFogMaps();
// Load the weather functions
void loadWeatherFunctions(const NLGEORGES::UFormElm &item);
};
#endif // CL_CONTINENT_H
/* End of continent.h */