forked from University/epr24pr42-ojanssen2
114 lines
3 KiB
C++
114 lines
3 KiB
C++
|
#include "Player.h"
|
||
|
#include "../Environment/Maze.h"
|
||
|
#include "../Exceptions/MovementNotPossible.h"
|
||
|
#include "../Util/GameState.h"
|
||
|
#include "../Environment/Game.h"
|
||
|
|
||
|
using game::GameState;
|
||
|
using game::Game;
|
||
|
using game_exceptions::MovementNotPossible;
|
||
|
|
||
|
namespace game
|
||
|
{
|
||
|
Player::Player(const int target_x, const int target_y): pos(target_x, target_y), keys_in_inventory(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
Player::Player(const PositionVector pos) : pos(pos), keys_in_inventory(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
PositionVector Player::get_pos() const
|
||
|
{
|
||
|
return this->pos;
|
||
|
}
|
||
|
|
||
|
void Player::update_position(const PositionVector& target)
|
||
|
{
|
||
|
this->pos = target;
|
||
|
}
|
||
|
|
||
|
Maze Player::handle_move(Maze& maze, const PositionVector& move_vector)
|
||
|
{
|
||
|
const PositionVector target_position = PositionVector(this->get_pos().x + move_vector.x,
|
||
|
this->get_pos().y + move_vector.y);
|
||
|
|
||
|
if (maze.is_pos_free(target_position, this->has_key_available()))
|
||
|
{
|
||
|
this->update_position(target_position);
|
||
|
}
|
||
|
else
|
||
|
throw MovementNotPossible("Bewegung nicht moeglich!");
|
||
|
return maze;
|
||
|
}
|
||
|
|
||
|
Maze Player::handle_user_input(Maze& maze, const char& input) {
|
||
|
PositionVector move_vector = {0, 0};
|
||
|
|
||
|
switch (input) {
|
||
|
case 'w':
|
||
|
move_vector = {-1, 0};
|
||
|
break;
|
||
|
case 's':
|
||
|
move_vector = {1, 0};
|
||
|
break;
|
||
|
case 'a':
|
||
|
move_vector = {0, -1};
|
||
|
break;
|
||
|
case 'd':
|
||
|
move_vector = {0, 1};
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
this->handle_move(maze, move_vector);
|
||
|
|
||
|
return maze;
|
||
|
}
|
||
|
|
||
|
void Player::handle_keys(Maze& maze) {
|
||
|
switch (maze.get_field(this->pos))
|
||
|
{
|
||
|
case 'K':
|
||
|
++this->keys_in_inventory;
|
||
|
maze.update_field(this->get_pos(), '.');
|
||
|
break;
|
||
|
case 'T':
|
||
|
--this->keys_in_inventory;
|
||
|
maze.update_field(this->get_pos(), '.');
|
||
|
break;
|
||
|
default: ;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GameState Player::handle_collisions(const GameState& prev_game_state, const Maze& maze) {
|
||
|
char field_at_pos = maze.get_field(this->get_pos());
|
||
|
// Game state sanity check
|
||
|
if (prev_game_state != GameState::RUNNING)
|
||
|
return prev_game_state;
|
||
|
|
||
|
if (field_at_pos == '.')
|
||
|
return GameState::RUNNING;
|
||
|
switch (field_at_pos) {
|
||
|
case 'A':
|
||
|
case 'B':
|
||
|
case 'C':
|
||
|
return GameState::HIT_BY_GHOST;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return prev_game_state;
|
||
|
}
|
||
|
|
||
|
|
||
|
void Player::tick(const GameState& prev_game_state, Maze& maze) {
|
||
|
this->handle_keys(maze);
|
||
|
this->handle_collisions(prev_game_state, maze);
|
||
|
}
|
||
|
|
||
|
bool Player::has_key_available() const
|
||
|
{
|
||
|
return this->keys_in_inventory > 0;
|
||
|
}
|
||
|
} // game
|