#ifndef __ALE_STATE_HPP__
#define __ALE_STATE_HPP__
#include <string>
#include "../emucore/OSystem.hxx"
#include "../emucore/Event.hxx"
#include "../common/Log.hpp"
namespace ale {
class RomSettings;
#define PADDLE_DELTA 23000
#define PADDLE_MIN 27450
#define PADDLE_MAX 790196
#define PADDLE_DEFAULT_VALUE (((PADDLE_MAX - PADDLE_MIN) / 2) + PADDLE_MIN)
class ALEState {
public:
ALEState();
ALEState(const ALEState& rhs, const std::string& serialized);
ALEState(const std::string& serialized);
void reset(int numResetSteps = 1);
bool equals(ALEState& state);
void resetPaddles(Event*);
void pressSelect(Event* event_obj);
void applyActionPaddles(Event* event_obj, int player_a_action,
int player_b_action);
void setActionJoysticks(Event* event_obj, int player_a_action,
int player_b_action);
void incrementFrame(int steps = 1);
void resetEpisodeFrameNumber();
int getFrameNumber() const { return m_frame_number; }
int getEpisodeFrameNumber() const { return m_episode_frame_number; }
void setDifficulty(unsigned int value) { m_difficulty = value; }
unsigned int getDifficulty() const { return m_difficulty; }
void setCurrentMode(game_mode_t value) { m_mode = value; }
game_mode_t getCurrentMode() const { return m_mode; }
std::string serialize();
protected:
friend class StellaEnvironment;
void load(OSystem* osystem, RomSettings* settings, std::string md5,
const ALEState& rhs, bool load_system);
ALEState save(OSystem* osystem, RomSettings* settings, std::string md5,
bool save_system);
void resetKeys(Event* event_obj);
void setPaddles(Event* event_obj, int left, int right);
void setPaddleLimits(int paddle_min_val, int paddle_max_val);
void updatePaddlePositions(Event* event_obj, int delta_x, int delta_y);
int calcPaddleResistance(int x_val);
void setDifficultySwitches(Event* event_obj, unsigned int value);
private:
int m_left_paddle; int m_right_paddle;
int m_paddle_min; int m_paddle_max;
int m_frame_number; int m_episode_frame_number;
std::string m_serialized_state;
game_mode_t m_mode; difficulty_t m_difficulty; };
}
#endif