aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'frontend')
-rw-r--r--frontend/CMakeLists.txt1
-rw-r--r--frontend/GameData.cpp7
-rw-r--r--frontend/cmd/get.cpp21
-rw-r--r--frontend/cmd/use.cpp8
-rw-r--r--frontend/util.cpp7
-rw-r--r--frontend/util.h12
6 files changed, 38 insertions, 18 deletions
diff --git a/frontend/CMakeLists.txt b/frontend/CMakeLists.txt
index 8f086d3..03191dd 100644
--- a/frontend/CMakeLists.txt
+++ b/frontend/CMakeLists.txt
@@ -7,6 +7,7 @@ target_sources(main PUBLIC
generate_dungeon.cpp
DB.cpp
GameData.cpp
+ util.cpp
)
add_subdirectory(cmd)
diff --git a/frontend/GameData.cpp b/frontend/GameData.cpp
index 30816c8..3b9046d 100644
--- a/frontend/GameData.cpp
+++ b/frontend/GameData.cpp
@@ -6,6 +6,8 @@
#include "backend/LocationFactory.h"
#include "backend/Object.h"
#include "backend/ObjectFactory.h"
+#include "backend/RNG.h"
+#include "backend/Range.h"
#include "backend/print.h"
#include "GameData.h"
@@ -39,7 +41,10 @@ Enemy * GameData::create_enemy(const string & name) const {
try {
auto row = query.row();
auto enemy = unique_ptr<Enemy>{ EnemyFactory::create_enemy(row.col<const char *>(0), row.col<const char *>(1)) };
- // TODO: min/max objects(?)
+ int object_count = RNG::get().rand_int(Range<int> { row.col<int>(2), row.col<int>(3) });
+ vector<string> object_names = this->random_objects(object_count);
+ for (const string & name : object_names)
+ enemy->add_hidden_object(this->create_object(name));
enemy->set_health(row.col<int>(4));
enemy->set_attack(static_cast<float>(row.col<int>(5)) / 100);
enemy->set_damage({ row.col<int>(6), row.col<int>(7) });
diff --git a/frontend/cmd/get.cpp b/frontend/cmd/get.cpp
index 3e85e57..362830e 100644
--- a/frontend/cmd/get.cpp
+++ b/frontend/cmd/get.cpp
@@ -1,7 +1,9 @@
+#include <algorithm>
#include <memory>
#include "../GameController.h"
#include "../strings.h"
+#include "../util.h"
#include "backend/Exception.h"
#include "backend/print.h"
@@ -14,19 +16,16 @@ using namespace std;
void GameController::cmd_get(string & target_name) {
Player & player = this->dungeon->get_player();
Location & location = player.get_location();
- unique_ptr<Object> target = nullptr;
- for (Object * object : location.get_visible_objects()) {
- if (str_lower(object->get_name().c_str()) != str_lower(target_name)) continue;
- target = unique_ptr<Object>(object);
- location.remove_visible_object(object);
- break;
- }
- if (target == nullptr)
+ auto range = location.get_visible_objects();
+ auto it = find_if(range.begin(), range.end(), by_name_case_insensitive(target_name));
+ if (!it)
throw Exception("object \"%s\" niet gevonden", target_name.c_str());
+ auto object = unique_ptr<Object>(*it);
+ location.remove_visible_object(object.get());
// gold objects are collected and (implicitly) destroyed
- GoldObject * gold = dynamic_cast<GoldObject *>(target.get());
+ GoldObject * gold = dynamic_cast<GoldObject *>(object.get());
if (gold != nullptr) {
int count = gold->get_count();
player.gold += count;
@@ -35,7 +34,7 @@ void GameController::cmd_get(string & target_name) {
}
// other objects go in the inventory
- lprtf("Je voegt %s toe aan je bezit.\n", target->get_name().c_str());
- player.inventory.push_back(target.release());
+ lprtf("Je voegt %s toe aan je bezit.\n", object->get_name().c_str());
+ player.inventory.push_back(object.release());
}
diff --git a/frontend/cmd/use.cpp b/frontend/cmd/use.cpp
index c636077..002255a 100644
--- a/frontend/cmd/use.cpp
+++ b/frontend/cmd/use.cpp
@@ -5,7 +5,7 @@
#include "backend/print.h"
#include "../GameController.h"
-#include "../strings.h"
+#include "../util.h"
using namespace std;
@@ -13,11 +13,7 @@ void GameController::cmd_use(string & target_name) {
Player & player = this->dungeon->get_player();
Location & location = player.get_location();
- auto it = find_if(player.inventory.begin(), player.inventory.end(),
- [target_name] (Object * object) {
- return str_lower(object->get_name().c_str()) == str_lower(target_name);
- }
- );
+ auto it = find_if(player.inventory.begin(), player.inventory.end(), by_name_case_insensitive(target_name));
if (!it)
throw Exception("object \"%s\" niet gevonden", target_name.c_str());
diff --git a/frontend/util.cpp b/frontend/util.cpp
new file mode 100644
index 0000000..afff38f
--- /dev/null
+++ b/frontend/util.cpp
@@ -0,0 +1,7 @@
+#include "util.h"
+#include "strings.h"
+
+bool by_name_case_insensitive::operator () (Object * object) {
+ return str_lower(object->get_name().c_str()) == str_lower(this->target_name);
+}
+
diff --git a/frontend/util.h b/frontend/util.h
new file mode 100644
index 0000000..946539f
--- /dev/null
+++ b/frontend/util.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <string>
+
+#include "backend/Object.h"
+
+struct by_name_case_insensitive {
+ by_name_case_insensitive(const std::string & target_name) : target_name(target_name) {}
+ std::string target_name;
+ bool operator () (Object * object);
+};
+