// Copyright (c) 2023 Alex Diener. All rights reserved.

#ifndef __GameplayScreen_H__
#define __GameplayScreen_H__

typedef struct GameplayScreen GameplayScreen;
#define GameplayScreen_superclass GameScreen

#include "PROJECT_NAME/GameData.h"
#include "PROJECT_NAME/GameScreen.h"
#include "PROJECT_NAME/GameState.h"
#include "PROJECT_NAME/GameView.h"
#include "utilities/UndoStack.h"

#define GameplayScreen_ivars \
	GameScreen_ivars \
	\
	GameData * gameData; \
	GameState * gameState; \
	GameView * gameView; \
	bool paused; \
	RoomStateUndoData roomStateUndoData; \
	UndoStack * undoStack; \
	GameSavedState * savedGameState;

#define GameplayScreen_vtable(self_type) \
	GameScreen_vtable(self_type)

stemobject_declare(GameplayScreen)

GameplayScreen * GameplayScreen_create(void);
bool GameplayScreen_init(GameplayScreen * self);
void GameplayScreen_dispose(GameplayScreen * self);

void GameplayScreen_update(GameplayScreen * self, double deltaTime);
bool GameplayScreen_mouseMoved(GameplayScreen * self, float x, float y, float deltaX, float deltaY, unsigned int modifiers, double timestamp);
bool GameplayScreen_mouseLeave(GameplayScreen * self, unsigned int modifiers, double timestamp);
bool GameplayScreen_keyDown(GameplayScreen * self, unsigned int charCode, unsigned int keyCode, unsigned int modifiers, bool isRepeat, double timestamp);
void GameplayScreen_listRenderables(GameplayScreen * self, RenderableIO * renderableIO, int drawOrderOffset, Rect4i clipBounds);
bool GameplayScreen_needsRedraw(GameplayScreen * self);
void GameplayScreen_activate(GameplayScreen * self, Screen * lastScreen, const char * transitionName);
void GameplayScreen_deactivate(GameplayScreen * self, Screen * lastScreen, const char * transitionName);

#endif
