summary refs log tree commit diff
path: root/src/Game.h
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Game.h
initial commit
Diffstat (limited to 'src/Game.h')
-rw-r--r--src/Game.h157
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