diff options
author | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
---|---|---|
committer | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
commit | abef6da56913f1c55528103e60a50451a39628b1 (patch) | |
tree | b3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Game.h |
initial commit
Diffstat (limited to 'src/Game.h')
-rw-r--r-- | src/Game.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/Game.h b/src/Game.h new file mode 100644 index 0000000..0cc145f --- /dev/null +++ b/src/Game.h @@ -0,0 +1,157 @@ +#ifndef CC_GAME_H +#define CC_GAME_H +#include "Core.h" +/* Represents the game and related structures. + Copyright 2014-2023 ClassiCube | Licensed under BSD-3 +*/ + +struct Bitmap; +struct Stream; +CC_VAR extern struct _GameData { + /* Width and height of the window. (1 at minimum) */ + int Width, Height; + /* Total time (in seconds) the game has been running for. */ + double Time; + /* Number of chunks updated within last second. Resets to 0 after every second. */ + int ChunkUpdates; +} Game; + +/* Stopwatch measurement of when current frame started */ +extern cc_uint64 Game_FrameStart; +extern struct RayTracer Game_SelectedPos; +extern cc_bool Game_UseCPEBlocks; + +extern cc_string Game_Username; +extern cc_string Game_Mppass; + +#ifdef CC_BUILD_SPLITSCREEN +extern int Game_NumLocalPlayers; +#else +#define Game_NumLocalPlayers 1 +#endif + +#if defined CC_BUILD_N64 + #define DEFAULT_VIEWDIST 20 +#elif defined CC_BUILD_NDS || defined CC_BUILD_PS1 + #define DEFAULT_VIEWDIST 192 +#else + #define DEFAULT_VIEWDIST 512 +#endif +#define DEFAULT_MAX_VIEWDIST 32768 + +extern int Game_ViewDistance; +extern int Game_MaxViewDistance; +extern int Game_UserViewDistance; + +/* Strategy used to limit FPS (see FpsLimitMethod enum) */ +extern int Game_FpsLimit; +extern cc_bool Game_SimpleArmsAnim; +extern int Game_Vertices; + +extern cc_bool Game_ClassicMode; +extern cc_bool Game_ClassicHacks; +#define Game_PureClassic (Game_ClassicMode && !Game_ClassicHacks) +extern cc_bool Game_AllowCustomBlocks; +extern cc_bool Game_AllowServerTextures; + +extern cc_bool Game_Anaglyph3D; +extern cc_bool Game_ViewBobbing; +extern cc_bool Game_BreakableLiquids; +/* Whether a screenshot should be taken at the end of this frame */ +extern cc_bool Game_ScreenshotRequested; +extern cc_bool Game_HideGui; + +enum GAME_VERSION_ { + VERSION_0017 = 27, VERSION_0019 = 28, VERSION_0023 = 29, VERSION_0030 = 30, VERSION_CPE = 31 +}; +struct GameVersion { + const char* Name; + cc_bool HasCPE; + cc_uint8 Version, Protocol, MaxCoreBlock; + cc_uint8 BlocksPerRow, InventorySize; + const cc_uint8* Inventory; + const cc_uint8* Hotbar; + const char* DefaultTexpack; +}; +extern struct GameVersion Game_Version; +extern void GameVersion_Load(void); + +enum FpsLimitMethod { + FPS_LIMIT_VSYNC, FPS_LIMIT_30, FPS_LIMIT_60, FPS_LIMIT_120, FPS_LIMIT_144, FPS_LIMIT_NONE, FPS_LIMIT_COUNT +}; +extern const char* const FpsLimit_Names[FPS_LIMIT_COUNT]; + +void Game_ToggleFullscreen(void); +void Game_CycleViewDistance(void); +/* Attempts to reduce VRAM usage (e.g. reducing view distance) */ +/* Returns false if VRAM cannot be reduced any further */ +cc_bool Game_ReduceVRAM(void); + +void Game_SetViewDistance(int distance); +void Game_UserSetViewDistance(int distance); +void Game_Disconnect(const cc_string* title, const cc_string* reason); +void Game_Reset(void); + +/* Sets the block in the map at the given coordinates, then updates state associated with the block. */ +/* (updating state means recalculating light, redrawing chunk block is in, etc) */ +/* NOTE: This does NOT notify the server, use Game_ChangeBlock for that. */ +CC_API void Game_UpdateBlock(int x, int y, int z, BlockID block); +/* Calls Game_UpdateBlock, then informs server connection of the block change. */ +/* In multiplayer this is sent to the server, in singleplayer just activates physics. */ +CC_API void Game_ChangeBlock(int x, int y, int z, BlockID block); + +cc_bool Game_CanPick(BlockID block); +/* Updates Game_Width and Game_Height. */ +void Game_UpdateDimensions(void); +/* Sets the strategy/method used to limit frames per second. */ +/* See FPS_LIMIT_ for valid strategies/methods */ +void Game_SetFpsLimit(int method); + +cc_bool Game_UpdateTexture(GfxResourceID* texId, struct Stream* src, const cc_string* file, + cc_uint8* skinType, int* heightDivisor); +/* Checks that the given bitmap can be loaded into a native gfx texture. */ +/* (must be power of two size and be <= Gfx_MaxTexWidth/Gfx_MaxHeight) */ +cc_bool Game_ValidateBitmap(const cc_string* file, struct Bitmap* bmp); +/* Checks that the given bitmap is a power of two size */ +/* NOTE: Game_ValidateBitmap should nearly always be used instead of this */ +cc_bool Game_ValidateBitmapPow2(const cc_string* file, struct Bitmap* bmp); + +/* Runs the main game loop until the window is closed. */ +void Game_Run(int width, int height, const cc_string* title); +/* Whether the game should be allowed to automatically close */ +cc_bool Game_ShouldClose(void); + +/* Represents a game component. */ +struct IGameComponent; +struct IGameComponent { + /* Called to init the component's state. (called when game is starting) */ + void (*Init)(void); + /* Called to free the component's state. (called when game is closing) */ + void (*Free)(void); + /* Called to reset the component's state. (e.g. reconnecting to server) */ + void (*Reset)(void); + /* Called to update the component's state when the user begins loading a new map. */ + void (*OnNewMap)(void); + /* Called to update the component's state when the user has finished loading a new map. */ + void (*OnNewMapLoaded)(void); + /* Next component in linked list of components. */ + struct IGameComponent* next; +}; +/* Adds a component to linked list of components. (always at end) */ +CC_NOINLINE void Game_AddComponent(struct IGameComponent* comp); + +/* Represents a task that periodically runs on the main thread every specified interval. */ +struct ScheduledTask; +struct ScheduledTask { + /* How long (in seconds) has elapsed since callback was last invoked */ + double accumulator; + /* How long (in seconds) between invocations of the callback */ + double interval; + /* Callback function that is periodically invoked */ + void (*Callback)(struct ScheduledTask* task); +}; + +typedef void (*ScheduledTaskCallback)(struct ScheduledTask* task); +/* Adds a task to list of scheduled tasks. (always at end) */ +CC_API int ScheduledTask_Add(double interval, ScheduledTaskCallback callback); +#endif |