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

#ifndef __GameState_H__
#define __GameState_H__

typedef struct GameState GameState;
#define GameState_superclass StemObject

#include "PROJECT_NAME/EntityPlayer.h"
#include "PROJECT_NAME/GameData.h"
#include "PROJECT_NAME/GameSavedState.h"
#include "PROJECT_NAME/RoomState.h"
#include "stemobject/StemObject.h"
#include "utilities/EventDispatcher.h"

struct GameState_roomChangedEvent {
	unsigned int oldRoomIndex;
	unsigned int newRoomIndex;
};

#define GameState_ivars \
	StemObject_ivars \
	\
	EventDispatcher * eventDispatcher; \
	GameData * gameData; \
	unsigned int roomCount; \
	RoomState ** rooms; \
	RoomState * currentRoomStateCopy; \
	EntityPlayer * roomResetPlayer; \
	unsigned int currentRoomIndex; \
	EntityPlayer * player;

#define GameState_vtable(self_type) \
	StemObject_vtable(self_type)

stemobject_declare(GameState)

GameState * GameState_create(GameData * gameData, GameSavedState * savedState);
bool GameState_init(GameState * self, GameData * gameData, GameSavedState * savedState);
void GameState_dispose(GameState * self);

void GameState_advanceTurn(GameState * self);
void GameState_changeRoom(GameState * self, unsigned int newRoomIndex);
void GameState_resetCurrentRoom(GameState * self);
GameSavedState * GameState_createSave(GameState * self);

#endif
