forked from Mirrors/openclonk
274 lines
6.7 KiB
C++
274 lines
6.7 KiB
C++
/*
|
|
* OpenClonk, http://www.openclonk.org
|
|
*
|
|
* Copyright (c) 1998-2000, Matthes Bender
|
|
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
|
|
* Copyright (c) 2009-2016, The OpenClonk Team and contributors
|
|
*
|
|
* Distributed under the terms of the ISC license; see accompanying file
|
|
* "COPYING" for details.
|
|
*
|
|
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
|
|
* See accompanying file "TRADEMARK" for details.
|
|
*
|
|
* To redistribute this file separately, substitute the full license texts
|
|
* for the above references.
|
|
*/
|
|
|
|
/* Core component of a scenario file */
|
|
|
|
#ifndef INC_C4Scenario
|
|
#define INC_C4Scenario
|
|
|
|
#include "lib/C4NameList.h"
|
|
#include "object/C4IDList.h"
|
|
|
|
class C4SVal
|
|
{
|
|
public:
|
|
C4SVal(int32_t std=0, int32_t rnd=0, int32_t min=0, int32_t max=100);
|
|
public:
|
|
int32_t Std,Rnd,Min,Max;
|
|
public:
|
|
void Default();
|
|
void Set(int32_t std=0, int32_t rnd=0, int32_t min=0, int32_t max=100);
|
|
void SetConstant(int32_t val);
|
|
int32_t Evaluate();
|
|
void CompileFunc(StdCompiler *pComp);
|
|
public:
|
|
inline bool operator==(const C4SVal &rhs) const
|
|
{
|
|
return rhs.Std == Std && rhs.Rnd == Rnd && rhs.Min == Min && rhs.Max == Max;
|
|
}
|
|
};
|
|
|
|
#define C4S_SECTIONLOAD 1 /* parts of the C4S that are modifyable for different landcape sections */
|
|
|
|
// flags for section reloading
|
|
#define C4S_SAVE_LANDSCAPE 1
|
|
#define C4S_SAVE_OBJECTS 2
|
|
#define C4S_KEEP_EFFECTS 4
|
|
#define C4S_REINIT_SCENARIO 8
|
|
|
|
enum C4SFilmMode
|
|
{
|
|
C4SFilm_None = 0,
|
|
C4SFilm_Normal = 1,
|
|
C4SFilm_Cinematic = 2
|
|
};
|
|
|
|
class C4SHead
|
|
{
|
|
public:
|
|
int32_t C4XVer[2];
|
|
char Title[C4MaxTitle+1];
|
|
char Loader[C4MaxTitle+1];
|
|
char Font[C4MaxTitle+1]; // scenario specific font; may be 0
|
|
int32_t Difficulty;
|
|
int32_t Icon;
|
|
bool NoInitialize;
|
|
int32_t MaxPlayer, MinPlayer, MaxPlayerLeague;
|
|
bool SaveGame;
|
|
bool Replay;
|
|
int32_t Film;
|
|
int32_t RandomSeed;
|
|
char Engine[C4MaxTitle+1]; // Relative filename of engine to be used for this scenario
|
|
char MissionAccess[C4MaxTitle+1];
|
|
bool Secret; // if true, scenario is invisible if MissionAccess has not been granted
|
|
bool NetworkGame;
|
|
bool NetworkRuntimeJoin;
|
|
StdCopyStrBuf Origin; // original oath and filename to scenario (for records and savegames)
|
|
public:
|
|
void Default();
|
|
void CompileFunc(StdCompiler *pComp, bool fSection);
|
|
};
|
|
|
|
|
|
const int32_t C4S_MaxDefinitions = 10;
|
|
|
|
class C4SDefinitions
|
|
{
|
|
public:
|
|
bool LocalOnly;
|
|
bool AllowUserChange;
|
|
C4IDList SkipDefs;
|
|
void SetModules(const char *szList, const char *szRelativeToPath=nullptr, const char *szRelativeToPath2=nullptr);
|
|
bool GetModules(StdStrBuf *psOutModules) const;
|
|
void Default();
|
|
void CompileFunc(StdCompiler *pComp);
|
|
|
|
private:
|
|
char Definition[C4S_MaxDefinitions][_MAX_PATH+1];
|
|
};
|
|
|
|
|
|
class C4SRealism
|
|
{
|
|
public:
|
|
C4IDList ValueOverloads;
|
|
bool LandscapePushPull; // Use new experimental push-pull-algorithms
|
|
bool LandscapeInsertThrust; // Inserted material may thrust material of lower density aside
|
|
|
|
public:
|
|
void Default();
|
|
};
|
|
|
|
|
|
class C4SGame
|
|
{
|
|
public:
|
|
StdCopyStrBuf Mode; // Game mode used by league to determine correct evaluation
|
|
C4IDList Goals;
|
|
C4IDList Rules;
|
|
|
|
bool FoWEnabled;
|
|
|
|
C4SRealism Realism;
|
|
|
|
public:
|
|
bool IsMelee();
|
|
void Default();
|
|
void CompileFunc(StdCompiler *pComp, bool fSection);
|
|
};
|
|
|
|
// Maximum map player extend factor
|
|
|
|
const int32_t C4S_MaxMapPlayerExtend = 4;
|
|
|
|
class C4SPlrStart
|
|
{
|
|
public:
|
|
C4SVal Wealth;
|
|
int32_t Position[2];
|
|
int32_t EnforcePosition;
|
|
C4IDList ReadyCrew;
|
|
C4IDList ReadyBase;
|
|
C4IDList ReadyVehic;
|
|
C4IDList ReadyMaterial;
|
|
C4IDList BuildKnowledge;
|
|
C4IDList BaseMaterial;
|
|
C4IDList BaseProduction;
|
|
public:
|
|
void Default();
|
|
bool EquipmentEqual(C4SPlrStart &rhs);
|
|
bool operator==(const C4SPlrStart& rhs);
|
|
void CompileFunc(StdCompiler *pComp);
|
|
};
|
|
|
|
|
|
class C4SLandscape
|
|
{
|
|
public:
|
|
bool ExactLandscape;
|
|
C4SVal VegLevel;
|
|
C4IDList Vegetation;
|
|
C4SVal InEarthLevel;
|
|
C4IDList InEarth;
|
|
int32_t BottomOpen,TopOpen;
|
|
int32_t LeftOpen,RightOpen;
|
|
bool AutoScanSideOpen;
|
|
char SkyDef[C4MaxDefString+1];
|
|
int32_t SkyDefFade[6];
|
|
bool NoScan;
|
|
C4SVal Gravity;
|
|
// Dynamic map
|
|
C4SVal MapWdt,MapHgt,MapZoom;
|
|
C4SVal Amplitude,Phase,Period,Random;
|
|
C4SVal LiquidLevel;
|
|
int32_t MapPlayerExtend;
|
|
C4NameList Layers;
|
|
char Material[C4M_MaxDefName+1];
|
|
char Liquid[C4M_MaxDefName+1];
|
|
bool KeepMapCreator; // set if the mapcreator will be needed in the scenario (for DrawDefMap)
|
|
int32_t SkyScrollMode; // sky scrolling mode for newgfx
|
|
int32_t MaterialZoom;
|
|
bool FlatChunkShapes; // if true, all material chunks are drawn flat
|
|
bool Secret; // hide map from observers (except in dev mode and the like)
|
|
public:
|
|
void Default();
|
|
void GetMapSize(int32_t &rWdt, int32_t &rHgt, int32_t iPlayerNum);
|
|
void CompileFunc(StdCompiler *pComp);
|
|
};
|
|
|
|
class C4SWeather
|
|
{
|
|
public:
|
|
C4SVal Climate;
|
|
C4SVal StartSeason,YearSpeed;
|
|
C4SVal Wind;
|
|
bool NoGamma;
|
|
public:
|
|
void Default();
|
|
void CompileFunc(StdCompiler *pComp);
|
|
};
|
|
|
|
class C4SAnimals
|
|
{
|
|
public:
|
|
C4IDList FreeLife;
|
|
C4IDList EarthNest;
|
|
public:
|
|
void Default();
|
|
void CompileFunc(StdCompiler *pComp);
|
|
};
|
|
|
|
class C4SEnvironment
|
|
{
|
|
public:
|
|
C4IDList Objects;
|
|
public:
|
|
void Default();
|
|
void CompileFunc(StdCompiler *pComp);
|
|
};
|
|
|
|
class C4Scenario
|
|
{
|
|
public:
|
|
C4Scenario();
|
|
public:
|
|
C4SHead Head;
|
|
C4SDefinitions Definitions;
|
|
C4SGame Game;
|
|
C4SPlrStart PlrStart[C4S_MaxPlayer];
|
|
C4SLandscape Landscape;
|
|
C4SAnimals Animals;
|
|
C4SWeather Weather;
|
|
C4SEnvironment Environment;
|
|
public:
|
|
void SetExactLandscape();
|
|
void Clear();
|
|
void Default();
|
|
bool Load(C4Group &hGroup, bool fLoadSection = false, bool suppress_errors = false);
|
|
bool Save(C4Group &hGroup, bool fSaveSection=false);
|
|
void CompileFunc(StdCompiler *pComp, bool fSection);
|
|
int32_t GetMinPlayer(); // will try to determine the minimum player count for this scenario
|
|
};
|
|
|
|
extern const char *C4ScenSect_Main;
|
|
|
|
// ref to one scenario section
|
|
class C4ScenarioSection
|
|
{
|
|
public:
|
|
C4ScenarioSection(const char *szName); // ctor
|
|
~C4ScenarioSection(); // dtor
|
|
|
|
public:
|
|
StdCopyStrBuf name; // section name
|
|
StdCopyStrBuf temp_filename; // filename of data file if in temp dir
|
|
StdCopyStrBuf filename; // filename of section in scenario file
|
|
bool fModified; // if set, the file is temp and contains runtime landscape and/or object data
|
|
class C4ScenarioObjectsScriptHost *pObjectScripts; // points to loaded script file for section Objects.c
|
|
|
|
C4ScenarioSection *pNext; // next member of linked list
|
|
|
|
public:
|
|
bool ScenarioLoad(const char *szFilename, bool is_temp_file); // called when scenario is loaded: extract to temp store
|
|
C4Group *GetGroupfile(C4Group &rGrp); // get group at section file (returns temp group, scenario subgroup or scenario group itself)
|
|
bool EnsureTempStore(bool fExtractLandscape, bool fExtractObjects); // make sure that a temp file is created, and nothing is modified within the main scenario file
|
|
};
|
|
|
|
|
|
|
|
#endif // INC_C4Scenario
|