mirror of
https://github.com/Motschen/Adventura.git
synced 2025-12-15 11:25:10 +01:00
fix: no more compile warnings
This commit is contained in:
@@ -1 +1,5 @@
|
|||||||
g++ -std=c++23 -Wall ./main.cpp -o ./adventura && ./adventura
|
g++ -std=c++23 -Wall main.cpp -o adventura
|
||||||
|
ODER
|
||||||
|
clang++ -std=c++23 -Weverything -Wno-c++98-compat -Wno-padded -Wall main.cpp -o adventura
|
||||||
|
|
||||||
|
Ausführen mit: ./adventura
|
||||||
2
TEST.txt
2
TEST.txt
@@ -1,4 +1,4 @@
|
|||||||
Für einen automatisierten Test, führe das Programm mit dem Argument --test aus. Zum Spielen einfach ohne Parameter.
|
Für einen automatisierten Test, führe das Programm mit dem Argument --test aus. Zum Spielen einfach ohne Parameter. Die untenstehenden Eingaben sind eine mögliche Kombination zum durchspielen – jede Zeile steht dabei für ein Level.
|
||||||
|
|
||||||
asdddddddddddddddwwwwwwddddddwwwwdddd
|
asdddddddddddddddwwwwwwddddddwwwwdddd
|
||||||
aaaaaaassssssddddssssdddddddddddwwwwwddddddwwwwdddddddddddddddddddd
|
aaaaaaassssssddddssssdddddddddddwwwwwddddddwwwwdddddddddddddddddddd
|
||||||
|
|||||||
32
block.hpp
32
block.hpp
@@ -5,10 +5,10 @@
|
|||||||
|
|
||||||
class Block {
|
class Block {
|
||||||
private:
|
private:
|
||||||
Identifier id = Identifier("adventure", "missing");
|
Identifier id_ = Identifier("adventure", "missing");
|
||||||
char encoding;
|
char encoding_;
|
||||||
Color color;
|
Color color_;
|
||||||
BlockSettings settings;
|
BlockSettings settings_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
@@ -18,7 +18,7 @@ public:
|
|||||||
* @param encoding The encoding of the block, which is the character used to represent it in the game world.
|
* @param encoding The encoding of the block, which is the character used to represent it in the game world.
|
||||||
* @param settings The settings of the block, which define how the block behaves in the game world.
|
* @param settings The settings of the block, which define how the block behaves in the game world.
|
||||||
*/
|
*/
|
||||||
Block(Identifier id, char encoding, BlockSettings settings) : Block(id, encoding, Color::RESET, settings) {};
|
Block(Identifier id, char encoding, BlockSettings settings) : Block(id, encoding, Color::RESET, settings) {}
|
||||||
/**
|
/**
|
||||||
* Constructs a block with the given identifier, encoding, color and settings.
|
* Constructs a block with the given identifier, encoding, color and settings.
|
||||||
*
|
*
|
||||||
@@ -28,11 +28,11 @@ public:
|
|||||||
* @param settings The settings of the block, which define how the block behaves in the game world.
|
* @param settings The settings of the block, which define how the block behaves in the game world.
|
||||||
*/
|
*/
|
||||||
Block(Identifier id, char encoding, Color color, BlockSettings settings) {
|
Block(Identifier id, char encoding, Color color, BlockSettings settings) {
|
||||||
this->id = id;
|
this->id_ = id;
|
||||||
this->encoding = encoding;
|
this->encoding_ = encoding;
|
||||||
this->color = color;
|
this->color_ = color;
|
||||||
this->settings = settings;
|
this->settings_ = settings;
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the settings associated with the block.
|
* Returns the settings associated with the block.
|
||||||
@@ -40,7 +40,7 @@ public:
|
|||||||
* @return The settings of the block, including solidity, pushability, and more.
|
* @return The settings of the block, including solidity, pushability, and more.
|
||||||
*/
|
*/
|
||||||
BlockSettings getSettings() {
|
BlockSettings getSettings() {
|
||||||
return settings;
|
return settings_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,7 +51,7 @@ public:
|
|||||||
* @return The identifier of the block.
|
* @return The identifier of the block.
|
||||||
*/
|
*/
|
||||||
Identifier getId() {
|
Identifier getId() {
|
||||||
return id;
|
return id_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -62,7 +62,7 @@ public:
|
|||||||
* @return The color of the block.
|
* @return The color of the block.
|
||||||
*/
|
*/
|
||||||
Color getColor() {
|
Color getColor() {
|
||||||
return color;
|
return color_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -73,7 +73,7 @@ public:
|
|||||||
* @return The character encoding of the block.
|
* @return The character encoding of the block.
|
||||||
*/
|
*/
|
||||||
char getEncoding() {
|
char getEncoding() {
|
||||||
return encoding;
|
return encoding_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,11 +84,11 @@ public:
|
|||||||
* @param encoding The character encoding to set for the block.
|
* @param encoding The character encoding to set for the block.
|
||||||
*/
|
*/
|
||||||
void setEncoding(char encoding) {
|
void setEncoding(char encoding) {
|
||||||
this->encoding = encoding;
|
this->encoding_ = encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out) {
|
std::ostream& operator<<(std::ostream& out) {
|
||||||
out << encoding;
|
out << encoding_;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
bool operator==(Block otherBlock) {
|
bool operator==(Block otherBlock) {
|
||||||
|
|||||||
28
blockPos.hpp
28
blockPos.hpp
@@ -6,12 +6,22 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Define an in-world position.
|
* Define an in-world position.
|
||||||
*
|
*
|
||||||
* @param x The x-coordinate of the BlockPos.
|
* @param xCoord The x-coordinate of the BlockPos.
|
||||||
* @param y The y-coordinate of the BlockPos.
|
* @param yCoord The y-coordinate of the BlockPos.
|
||||||
*/
|
*/
|
||||||
BlockPos(int x, int y) {
|
BlockPos(int xCoord, int yCoord) {
|
||||||
this->x = x;
|
this->x = xCoord;
|
||||||
this->y = y;
|
this->y = yCoord;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Define an in-world position.
|
||||||
|
*
|
||||||
|
* @param xCoord The x-coordinate of the BlockPos.
|
||||||
|
* @param yCoord The y-coordinate of the BlockPos.
|
||||||
|
*/
|
||||||
|
BlockPos(unsigned int xCoord, unsigned int yCoord) {
|
||||||
|
this->x = static_cast<int>(xCoord);
|
||||||
|
this->y = static_cast<int>(yCoord);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,12 +66,12 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Add the given coordinates to the BlockPos.
|
* Add the given coordinates to the BlockPos.
|
||||||
*
|
*
|
||||||
* @param x The x-coordinate to add.
|
* @param xOffset The x-coordinate to add.
|
||||||
* @param y The y-coordinate to add.
|
* @param yOffset The y-coordinate to add.
|
||||||
* @return The BlockPos with the given coordinates added.
|
* @return The BlockPos with the given coordinates added.
|
||||||
*/
|
*/
|
||||||
BlockPos add(int x, int y) {
|
BlockPos add(int xOffset, int yOffset) {
|
||||||
return BlockPos(this->x + x, this->y + y);
|
return BlockPos(this->x + xOffset, this->y + yOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockPos operator+(BlockPos offset) {
|
BlockPos operator+(BlockPos offset) {
|
||||||
|
|||||||
@@ -13,6 +13,6 @@ enum class Color {
|
|||||||
BRIGHT_WHITE= 97
|
BRIGHT_WHITE= 97
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& os, Color color) {
|
static std::ostream& operator<<(std::ostream& os, Color color) {
|
||||||
return os << "\033[" << static_cast<int>(color) << "m";
|
return os << "\033[" << static_cast<int>(color) << "m";
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ using std::vector;
|
|||||||
* @param extension The file extension to filter by
|
* @param extension The file extension to filter by
|
||||||
* @return A list of all filtered file names in the specified directory, sorted alphabetically.
|
* @return A list of all filtered file names in the specified directory, sorted alphabetically.
|
||||||
*/
|
*/
|
||||||
vector<string> getOrderedFileNames(string dir, string extension) {
|
static vector<string> getOrderedFileNames(string dir, string extension) {
|
||||||
vector<string> worlds;
|
vector<string> worlds;
|
||||||
// This used to be elegant and iterate over all files in the worlds directory,
|
// This used to be elegant and iterate over all files in the worlds directory,
|
||||||
// but because of the weird restriction with no folders being allowed, we just filter the files based on their extension.
|
// but because of the weird restriction with no folders being allowed, we just filter the files based on their extension.
|
||||||
@@ -44,7 +44,7 @@ vector<string> getOrderedFileNames(string dir, string extension) {
|
|||||||
* @param fileLocation The location of the file to read.
|
* @param fileLocation The location of the file to read.
|
||||||
* @return The content of the file as a vector of strings.
|
* @return The content of the file as a vector of strings.
|
||||||
*/
|
*/
|
||||||
vector<string> readFileAsVector(const string& fileLocation) {
|
static vector<string> readFileAsVector(const string& fileLocation) {
|
||||||
vector<string> lines;
|
vector<string> lines;
|
||||||
|
|
||||||
std::ifstream file(fileLocation);
|
std::ifstream file(fileLocation);
|
||||||
@@ -65,7 +65,7 @@ vector<string> readFileAsVector(const string& fileLocation) {
|
|||||||
* @param fileLocation Path to the file to be printed.
|
* @param fileLocation Path to the file to be printed.
|
||||||
* @param color Color to be used for the output.
|
* @param color Color to be used for the output.
|
||||||
*/
|
*/
|
||||||
void printFile(string fileLocation, Color color) {
|
static void printFile(string fileLocation, Color color) {
|
||||||
cout << color;
|
cout << color;
|
||||||
vector<string> file = readFileAsVector(fileLocation);
|
vector<string> file = readFileAsVector(fileLocation);
|
||||||
for (unsigned int y = 0; y < file.size(); y++) {
|
for (unsigned int y = 0; y < file.size(); y++) {
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ using std::string;
|
|||||||
|
|
||||||
class Identifier {
|
class Identifier {
|
||||||
public:
|
public:
|
||||||
std::string nameSpace;
|
std::string nameSpace_;
|
||||||
std::string path;
|
std::string path_;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,22 +16,20 @@ public:
|
|||||||
* @param nameSpace The namespace of the Identifier.
|
* @param nameSpace The namespace of the Identifier.
|
||||||
* @param path The path of the Identifier.
|
* @param path The path of the Identifier.
|
||||||
*/
|
*/
|
||||||
Identifier(std::string nameSpace, std::string path) : nameSpace(nameSpace), path(path) {
|
Identifier(std::string nameSpace, std::string path) : nameSpace_(nameSpace), path_(path) {}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out) {
|
std::ostream& operator<<(std::ostream& out) {
|
||||||
out << nameSpace << ":" << path;
|
out << nameSpace_ << ":" << path_;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
std::istream& operator>>(std::istream& in) {
|
std::istream& operator>>(std::istream& in) {
|
||||||
string input;
|
string input;
|
||||||
in >> input;
|
in >> input;
|
||||||
nameSpace = input.substr(0, input.find(":"));
|
nameSpace_ = input.substr(0, input.find(":"));
|
||||||
path = input.substr(input.find(":") + 1, input.length());
|
path_ = input.substr(input.find(":") + 1, input.length());
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
bool operator==(Identifier otherId) {
|
bool operator==(Identifier otherId) {
|
||||||
return this->nameSpace == otherId.nameSpace && this->path == otherId.path;
|
return this->nameSpace_ == otherId.nameSpace_ && this->path_ == otherId.path_;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
15
main.cpp
15
main.cpp
@@ -17,8 +17,8 @@ using std::endl;
|
|||||||
bool startWorld(string worldFile);
|
bool startWorld(string worldFile);
|
||||||
bool parseArgs(int argc, char *argv[]);
|
bool parseArgs(int argc, char *argv[]);
|
||||||
|
|
||||||
bool testMode = false;
|
static bool testMode = false;
|
||||||
unsigned int worldIndex = 2;
|
static unsigned int worldIndex = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry point of the program.
|
* Entry point of the program.
|
||||||
@@ -31,15 +31,16 @@ int main(int argc, char *argv[]) {
|
|||||||
if (parseArgs(argc, argv)) return 0;
|
if (parseArgs(argc, argv)) return 0;
|
||||||
|
|
||||||
if (!testMode) {
|
if (!testMode) {
|
||||||
printFile("./start.screen.txt", Color::BRIGHT_YELLOW);
|
printFile("./start.screen.txt", Color::BRIGHT_YELLOW); // Show the story introduction
|
||||||
waitForInput();
|
waitForInput();
|
||||||
printGuide();
|
printGuide(); // Show the block guide
|
||||||
waitForInput();
|
waitForInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load every world in order
|
// Load every world in order
|
||||||
for (const auto & world : getOrderedFileNames("./", ".world.txt"))
|
for (const auto & world : getOrderedFileNames("./", ".world.txt"))
|
||||||
if (!startWorld(world)) return 0;
|
if (!startWorld(world)) return 0; // If the player dies, exit
|
||||||
|
|
||||||
// Print the victory screen once all levels have been completed
|
// Print the victory screen once all levels have been completed
|
||||||
printFile("./victory.screen.txt", Color::BRIGHT_GREEN);
|
printFile("./victory.screen.txt", Color::BRIGHT_GREEN);
|
||||||
|
|
||||||
@@ -85,14 +86,14 @@ bool startWorld(string worldFile) {
|
|||||||
bool parseArgs(int argc, char *argv[]) {
|
bool parseArgs(int argc, char *argv[]) {
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
string arg = string(argv[i]);
|
string arg = string(argv[i]); // Unsafe buffer usage warnings can be safely ignored, as we do check for the size
|
||||||
if (arg == "-h" || arg == "--help")
|
if (arg == "-h" || arg == "--help")
|
||||||
break;
|
break;
|
||||||
else if (arg == "-t" || arg == "--test")
|
else if (arg == "-t" || arg == "--test")
|
||||||
testMode = true;
|
testMode = true;
|
||||||
|
|
||||||
else if ((arg == "-l" || arg == "--level") && argc > i + 1) {
|
else if ((arg == "-l" || arg == "--level") && argc > i + 1) {
|
||||||
if (!startWorld("./" + string(argv[i+1])))
|
if (!startWorld("./" + string(argv[i+1]))) // This warning can also be ignored, again – we do this in a safe way
|
||||||
return true; // Load only the specified world
|
return true; // Load only the specified world
|
||||||
else
|
else
|
||||||
printFile("./completed_single_level.screen.txt", Color::BRIGHT_GREEN);
|
printFile("./completed_single_level.screen.txt", Color::BRIGHT_GREEN);
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
#include "blockRegistry.hpp"
|
#include "blockRegistry.hpp"
|
||||||
#include "output.hpp"
|
#include "output.hpp"
|
||||||
|
|
||||||
void tryPushBlock(BlockPos& blockPos, World& world, bool left);
|
static void tryPushBlock(BlockPos& blockPos, World& world, bool left);
|
||||||
void tryBlockGravity(BlockPos& blockPos, World& world);
|
static void tryBlockGravity(BlockPos& blockPos, World& world);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a given value is in a parameter pack of values.
|
* Checks if a given value is in a parameter pack of values.
|
||||||
@@ -22,7 +22,7 @@ void tryBlockGravity(BlockPos& blockPos, World& world);
|
|||||||
* @return true if the value is found in the parameter pack, false otherwise.
|
* @return true if the value is found in the parameter pack, false otherwise.
|
||||||
*/
|
*/
|
||||||
template<typename First, typename ... T>
|
template<typename First, typename ... T>
|
||||||
bool is_in(First &&first, T && ... t) {
|
static bool is_in(First &&first, T && ... t) {
|
||||||
return ((first == t) || ...);
|
return ((first == t) || ...);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ bool is_in(First &&first, T && ... t) {
|
|||||||
* Waits until the user enters a valid key.
|
* Waits until the user enters a valid key.
|
||||||
* Used to prompt the user to press any key to continue.
|
* Used to prompt the user to press any key to continue.
|
||||||
*/
|
*/
|
||||||
void waitForInput() {
|
static void waitForInput() {
|
||||||
char lastChar = ' ';
|
char lastChar = ' ';
|
||||||
while (!is_in(lastChar, 'w', 'a', 's', 'd')) cin >> lastChar;
|
while (!is_in(lastChar, 'w', 'a', 's', 'd')) cin >> lastChar;
|
||||||
}
|
}
|
||||||
@@ -48,7 +48,7 @@ void waitForInput() {
|
|||||||
* @param left Whether to move left (true) or right (false).
|
* @param left Whether to move left (true) or right (false).
|
||||||
* @return true if the player's position was successfully updated, false otherwise.
|
* @return true if the player's position was successfully updated, false otherwise.
|
||||||
*/
|
*/
|
||||||
bool tryWalk(World& world, Player& player, bool left) {
|
static bool tryWalk(World& world, Player& player, bool left) {
|
||||||
BlockPos playerPos = player.getPos();
|
BlockPos playerPos = player.getPos();
|
||||||
BlockPos neighbourPosTorso = playerPos+(left ? BlockPos(-1, 0) : BlockPos(1, 0));
|
BlockPos neighbourPosTorso = playerPos+(left ? BlockPos(-1, 0) : BlockPos(1, 0));
|
||||||
BlockPos neighbourPosFeet = playerPos+(left ? BlockPos(-1, 1) : BlockPos(1, 1));
|
BlockPos neighbourPosFeet = playerPos+(left ? BlockPos(-1, 1) : BlockPos(1, 1));
|
||||||
@@ -76,7 +76,7 @@ bool tryWalk(World& world, Player& player, bool left) {
|
|||||||
* @param player Reference to the Player object representing the player's state.
|
* @param player Reference to the Player object representing the player's state.
|
||||||
* @return true if the player's position was successfully updated, false otherwise.
|
* @return true if the player's position was successfully updated, false otherwise.
|
||||||
*/
|
*/
|
||||||
bool tryGoDown(World& world, Player& player) {
|
static bool tryGoDown(World& world, Player& player) {
|
||||||
if (world.getBlockAt(player.getPos()+BlockPos(0, 2)).getSettings().isClimbableFromTop() || world.getBlockAt(player.getPos()+BlockPos(0, 3)).getSettings().isClimbableFromTop()) {
|
if (world.getBlockAt(player.getPos()+BlockPos(0, 2)).getSettings().isClimbableFromTop() || world.getBlockAt(player.getPos()+BlockPos(0, 3)).getSettings().isClimbableFromTop()) {
|
||||||
player.move(0, 1);
|
player.move(0, 1);
|
||||||
return true;
|
return true;
|
||||||
@@ -95,7 +95,7 @@ bool tryGoDown(World& world, Player& player) {
|
|||||||
* @param player Reference to the Player object representing the player's state.
|
* @param player Reference to the Player object representing the player's state.
|
||||||
* @return true if the player's position was successfully updated, false otherwise.
|
* @return true if the player's position was successfully updated, false otherwise.
|
||||||
*/
|
*/
|
||||||
bool tryGoUp(World& world, Player& player) {
|
static bool tryGoUp(World& world, Player& player) {
|
||||||
if (world.getBlockAt(player.getPos()+BlockPos(0, 1)).getSettings().isClimbableFromBottom() || world.getBlockAt(player.getPos()+BlockPos(0, 2)).getSettings().isClimbableFromBottom()) {
|
if (world.getBlockAt(player.getPos()+BlockPos(0, 1)).getSettings().isClimbableFromBottom() || world.getBlockAt(player.getPos()+BlockPos(0, 2)).getSettings().isClimbableFromBottom()) {
|
||||||
player.move(0, -1);
|
player.move(0, -1);
|
||||||
return true;
|
return true;
|
||||||
@@ -115,7 +115,7 @@ bool tryGoUp(World& world, Player& player) {
|
|||||||
* @param world Reference to the World object representing the current world.
|
* @param world Reference to the World object representing the current world.
|
||||||
* @param left Whether to push the block to the left (true) or right (false).
|
* @param left Whether to push the block to the left (true) or right (false).
|
||||||
*/
|
*/
|
||||||
void tryPushBlock(BlockPos& blockPos, World& world, bool left) {
|
static void tryPushBlock(BlockPos& blockPos, World& world, bool left) {
|
||||||
BlockPos neighbourBlockPos = blockPos+(left ? BlockPos(-1, 0) : BlockPos(1, 0));
|
BlockPos neighbourBlockPos = blockPos+(left ? BlockPos(-1, 0) : BlockPos(1, 0));
|
||||||
if (world.getBlockAt(blockPos).getSettings().isPushable()) {
|
if (world.getBlockAt(blockPos).getSettings().isPushable()) {
|
||||||
if (world.getBlockAt(neighbourBlockPos).getSettings().isPushable()) {
|
if (world.getBlockAt(neighbourBlockPos).getSettings().isPushable()) {
|
||||||
@@ -135,7 +135,7 @@ void tryPushBlock(BlockPos& blockPos, World& world, bool left) {
|
|||||||
* @param playerPos The position of the player.
|
* @param playerPos The position of the player.
|
||||||
* @param world Reference to the World object representing the current world.
|
* @param world Reference to the World object representing the current world.
|
||||||
*/
|
*/
|
||||||
void tryBlockGravity(BlockPos& playerPos, World& world) {
|
static void tryBlockGravity(BlockPos& playerPos, World& world) {
|
||||||
if (world.getBlockAt(playerPos.add(0, 2)).getSettings().hasGravity() && world.getBlockAt(playerPos.add(0, 3)) == world.getBlockRegistry().AIR) {
|
if (world.getBlockAt(playerPos.add(0, 2)).getSettings().hasGravity() && world.getBlockAt(playerPos.add(0, 3)) == world.getBlockRegistry().AIR) {
|
||||||
world.setBlockAt(playerPos.add(0, 3), world.getBlockAt(playerPos.add(0, 2)));
|
world.setBlockAt(playerPos.add(0, 3), world.getBlockAt(playerPos.add(0, 2)));
|
||||||
world.setBlockAt(playerPos.add(0, 2), world.getBlockRegistry().AIR);
|
world.setBlockAt(playerPos.add(0, 2), world.getBlockRegistry().AIR);
|
||||||
@@ -153,7 +153,7 @@ void tryBlockGravity(BlockPos& playerPos, World& world) {
|
|||||||
* @return true if the player's position was successfully updated, false otherwise.
|
* @return true if the player's position was successfully updated, false otherwise.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool onInput(char lastChar, World& world, Player& player) {
|
static bool onInput(char lastChar, World& world, Player& player) {
|
||||||
switch (lastChar) {
|
switch (lastChar) {
|
||||||
case ' ':
|
case ' ':
|
||||||
case 'w':
|
case 'w':
|
||||||
@@ -182,7 +182,7 @@ bool onInput(char lastChar, World& world, Player& player) {
|
|||||||
* In this case, the game state is updated every 100 milliseconds (to simulate the player's input).
|
* In this case, the game state is updated every 100 milliseconds (to simulate the player's input).
|
||||||
* If the player dies or reaches the goal, exit the loop.
|
* If the player dies or reaches the goal, exit the loop.
|
||||||
*/
|
*/
|
||||||
void inputLoop(Player& player, World& world, bool testMode, unsigned int worldIndex) {
|
static void inputLoop(Player& player, World& world, bool testMode, unsigned int worldIndex) {
|
||||||
vector<string> testFile = readFileAsVector("TEST.txt");
|
vector<string> testFile = readFileAsVector("TEST.txt");
|
||||||
unsigned int inputIndex = 0;
|
unsigned int inputIndex = 0;
|
||||||
while (player.isAlive() && !player.hasReachedGoal()) {
|
while (player.isAlive() && !player.hasReachedGoal()) {
|
||||||
|
|||||||
12
output.hpp
12
output.hpp
@@ -12,7 +12,7 @@ using std::endl;
|
|||||||
* Move the console cursor up by one line.
|
* Move the console cursor up by one line.
|
||||||
* Used to overwrite the previous line.
|
* Used to overwrite the previous line.
|
||||||
*/
|
*/
|
||||||
void jumpBackOneLine() {
|
static void jumpBackOneLine() {
|
||||||
std::cout << "\033[1A";
|
std::cout << "\033[1A";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,9 +22,9 @@ void jumpBackOneLine() {
|
|||||||
* On positions that overlap with the player texture, the relevant character of the player's texture is printed instead.
|
* On positions that overlap with the player texture, the relevant character of the player's texture is printed instead.
|
||||||
*
|
*
|
||||||
* @param world Reference to the World object representing the current world.
|
* @param world Reference to the World object representing the current world.
|
||||||
* @param player Reference to the Player object representing the player's state.
|
* @param playerTexture Reference to the current Player texture.
|
||||||
*/
|
*/
|
||||||
void render(World &world, vector<vector<char>> playerTexture) {
|
static void render(World &world, vector<vector<char>> playerTexture) {
|
||||||
vector<vector<Block>> canvas = world.getFieldState();
|
vector<vector<Block>> canvas = world.getFieldState();
|
||||||
|
|
||||||
|
|
||||||
@@ -51,9 +51,9 @@ void render(World &world, vector<vector<char>> playerTexture) {
|
|||||||
* and the player.
|
* and the player.
|
||||||
*
|
*
|
||||||
* @param world Reference to the World object representing the current world.
|
* @param world Reference to the World object representing the current world.
|
||||||
* @param player Reference to the Player object representing the player's state.
|
* @param playerTexture Reference to the current Player texture.
|
||||||
*/
|
*/
|
||||||
void redraw(World &world, vector<vector<char>> playerTexture) {
|
static void redraw(World &world, vector<vector<char>> playerTexture) {
|
||||||
for (unsigned int y = 0; y <= world.getMaxY(); y++) {
|
for (unsigned int y = 0; y <= world.getMaxY(); y++) {
|
||||||
jumpBackOneLine();
|
jumpBackOneLine();
|
||||||
}
|
}
|
||||||
@@ -64,7 +64,7 @@ void redraw(World &world, vector<vector<char>> playerTexture) {
|
|||||||
* Prints a guide for the player, explaining what each block in the game
|
* Prints a guide for the player, explaining what each block in the game
|
||||||
* represents.
|
* represents.
|
||||||
*/
|
*/
|
||||||
void printGuide() {
|
static void printGuide() {
|
||||||
// We use a vector here instead of a map, because we want to keep this order
|
// We use a vector here instead of a map, because we want to keep this order
|
||||||
std::vector<std::pair<string, Color>> guide = {
|
std::vector<std::pair<string, Color>> guide = {
|
||||||
{"- Plattform", Color::RESET},
|
{"- Plattform", Color::RESET},
|
||||||
|
|||||||
38
player.hpp
38
player.hpp
@@ -11,16 +11,16 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Initializes a new Player at the specified starting position in the provided world.
|
* Initializes a new Player at the specified starting position in the provided world.
|
||||||
*
|
*
|
||||||
* @param pos The initial position of the player within the world.
|
* @param initialPos The initial position of the player within the world.
|
||||||
* @param world A reference to the World object representing the game world.
|
* @param currentWorld A reference to the World object representing the game world.
|
||||||
*/
|
*/
|
||||||
Player(BlockPos pos, World& world) : world(world) {
|
Player(BlockPos initialPos, World& currentWorld) : world(currentWorld) {
|
||||||
this->pos = pos;
|
this->pos = initialPos;
|
||||||
this->world = world;
|
this->world = currentWorld;
|
||||||
playerTexture = REGULAR_PLAYER_TEXTURE;
|
playerTexture = REGULAR_PLAYER_TEXTURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*initialP
|
||||||
* Retrieves the current position of the player in the world.
|
* Retrieves the current position of the player in the world.
|
||||||
*
|
*
|
||||||
* @return The current BlockPos representing the player's position.
|
* @return The current BlockPos representing the player's position.
|
||||||
@@ -52,20 +52,20 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Updates the player's position and checks for any conditions that would update the state of the player.
|
* Updates the player's position and checks for any conditions that would update the state of the player.
|
||||||
*
|
*
|
||||||
* @param pos The position to move the player to.
|
* @param newPos The position to move the player to.
|
||||||
*/
|
*/
|
||||||
void setPos(BlockPos pos) {
|
void setPos(BlockPos newPos) {
|
||||||
if (!world.containsPos(pos)) {
|
if (!world.containsPos(newPos)) {
|
||||||
alive = false;
|
alive = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this->pos = pos;
|
this->pos = newPos;
|
||||||
|
|
||||||
if (world.getBlockAt(pos) == world.getBlockRegistry().GOAL) reachedGoal = true;
|
if (world.getBlockAt(newPos) == world.getBlockRegistry().GOAL) reachedGoal = true;
|
||||||
|
|
||||||
if (world.getBlockAt(pos.add(0, 2)) == world.getBlockRegistry().WATER) fallLength = 0;
|
if (world.getBlockAt(newPos.add(0, 2)) == world.getBlockRegistry().WATER) fallLength = 0;
|
||||||
|
|
||||||
isFreeFalling = !world.getBlockAt(pos.add(0, 2)).getSettings().isSolid();
|
isFreeFalling = !world.getBlockAt(newPos.add(0, 2)).getSettings().isSolid();
|
||||||
if (isFreeFalling) {
|
if (isFreeFalling) {
|
||||||
fallLength += 1;
|
fallLength += 1;
|
||||||
if (fallLength > 2) playerTexture = FALLING_PLAYER_TEXTURE;
|
if (fallLength > 2) playerTexture = FALLING_PLAYER_TEXTURE;
|
||||||
@@ -79,7 +79,7 @@ public:
|
|||||||
fallLength = 0;
|
fallLength = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (world.getBlockAt(pos.add(0, 2)).getSettings().isLethal()) unalive();
|
if (world.getBlockAt(newPos.add(0, 2)).getSettings().isLethal()) unalive();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,13 +121,13 @@ public:
|
|||||||
while (map.size() <= y) map.push_back({});
|
while (map.size() <= y) map.push_back({});
|
||||||
while (map[y].size() <= x) map[y].push_back(' ');
|
while (map[y].size() <= x) map[y].push_back(' ');
|
||||||
|
|
||||||
int yOffset = y-pos.getY() + 1;
|
int yOffset = static_cast<int>(y)-static_cast<int>(pos.getUnsignedY()) + 1;
|
||||||
int xOffset = x-pos.getX() + 1;
|
int xOffset = static_cast<int>(x)-static_cast<int>(pos.getUnsignedX()) + 1;
|
||||||
|
|
||||||
char encoding = ' ';
|
char encoding = ' ';
|
||||||
if (yOffset >= 0 && yOffset < static_cast<int>(playerTexture.size()) &&
|
if (yOffset >= 0 && yOffset < (static_cast<int>(static_cast<size_t>(playerTexture.size()))) &&
|
||||||
xOffset >= 0 && xOffset < static_cast<int>(playerTexture.at(yOffset).size())) {
|
xOffset >= 0 && xOffset < (static_cast<int>(playerTexture.at(static_cast<size_t>(yOffset)).size()))) {
|
||||||
encoding = playerTexture.at(yOffset).at(xOffset);
|
encoding = playerTexture.at(static_cast<unsigned int>(yOffset)).at(static_cast<unsigned int>(xOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
map[y][x] = encoding;
|
map[y][x] = encoding;
|
||||||
|
|||||||
10
world.hpp
10
world.hpp
@@ -13,10 +13,10 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Create a World object using the blocks defined in BlockRegistry.
|
* Create a World object using the blocks defined in BlockRegistry.
|
||||||
*
|
*
|
||||||
* @param blockRegistry The BlockRegistry to use.
|
* @param worldBlockRegistry The BlockRegistry to use.
|
||||||
*/
|
*/
|
||||||
World(BlockRegistry blockRegistry) {
|
World(BlockRegistry worldBlockRegistry) {
|
||||||
this->blockRegistry = blockRegistry;
|
this->blockRegistry = worldBlockRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -54,7 +54,7 @@ public:
|
|||||||
while (field.size() <= pos.getUnsignedY()) field.push_back({});
|
while (field.size() <= pos.getUnsignedY()) field.push_back({});
|
||||||
while (field[pos.getUnsignedY()].size() <= pos.getUnsignedX()) field[pos.getUnsignedY()].push_back(blockRegistry.AIR);
|
while (field[pos.getUnsignedY()].size() <= pos.getUnsignedX()) field[pos.getUnsignedY()].push_back(blockRegistry.AIR);
|
||||||
|
|
||||||
field[pos.getUnsignedY()][pos.getX()] = block;
|
field[pos.getUnsignedY()][pos.getUnsignedX()] = block;
|
||||||
if (block.getSettings().hasGravity() && containsPos(pos.add(0, 1)) && getBlockAt(pos.add(0, 1)) == blockRegistry.AIR) {
|
if (block.getSettings().hasGravity() && containsPos(pos.add(0, 1)) && getBlockAt(pos.add(0, 1)) == blockRegistry.AIR) {
|
||||||
setBlockAt(pos.add(0, 1), block);
|
setBlockAt(pos.add(0, 1), block);
|
||||||
setBlockAt(pos, blockRegistry.AIR);
|
setBlockAt(pos, blockRegistry.AIR);
|
||||||
@@ -71,7 +71,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
Block& getBlockAt(BlockPos pos) {
|
Block& getBlockAt(BlockPos pos) {
|
||||||
if (pos.getUnsignedY() < field.size() && pos.getUnsignedX() < field[pos.getUnsignedY()].size()) {
|
if (pos.getUnsignedY() < field.size() && pos.getUnsignedX() < field[pos.getUnsignedY()].size()) {
|
||||||
return field[pos.getY()][pos.getX()];
|
return field[pos.getUnsignedY()][pos.getUnsignedX()];
|
||||||
}
|
}
|
||||||
//cout << "Out of bounds: " << pos.getX() << ", " << pos.getY() << endl;
|
//cout << "Out of bounds: " << pos.getX() << ", " << pos.getY() << endl;
|
||||||
return blockRegistry.AIR;
|
return blockRegistry.AIR;
|
||||||
|
|||||||
Reference in New Issue
Block a user