Skip to content

Commit f0d2fc6

Browse files
committed
Downloading of creature lists
1 parent d5f13c4 commit f0d2fc6

10 files changed

Lines changed: 609 additions & 10 deletions

CMakeLists.txt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,33 @@
33
#
44
cmake_minimum_required (VERSION 3.8)
55

6+
# Enable Hot Reload for MSVC compilers if supported.
7+
if (POLICY CMP0141)
8+
cmake_policy(SET CMP0141 NEW)
9+
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
10+
endif()
11+
12+
613
set(CMAKE_CXX_STANDARD 17)
714
set(CMAKE_CXX_STANDARD_REQUIRED True)
815

916
project ("EncounterMaster" C CXX)
1017

1118
# Add source to this project's executable.
12-
add_executable (EncounterMaster "EncounterMaster.cpp" "imgui/imgui.cpp" "imgui/imgui_draw.cpp" "imgui/imgui_demo.cpp" "imgui/imgui_tables.cpp" "imgui/imgui_widgets.cpp" "imgui/backends/imgui_impl_sdlrenderer3.cpp" "imgui/backends/imgui_impl_sdl3.cpp")
19+
add_executable (EncounterMaster "EncounterMaster.cpp" "Menu.cpp" "imgui/imgui.cpp" "imgui/imgui_draw.cpp" "imgui/imgui_demo.cpp" "imgui/imgui_tables.cpp" "imgui/imgui_widgets.cpp" "imgui/backends/imgui_impl_sdlrenderer3.cpp" "imgui/backends/imgui_impl_sdl3.cpp" "Creature.h" "Creature.cpp" "Download.h" "Download.cpp")
1320

1421
# VCPKG configuration (wouldn't work without manually setting it sorry)
1522
set(CMAKE_TOOLCHAIN_FILE "E:/vcpkg/scripts/buildsystems/vcpkg.cmake")
1623
include("${CMAKE_TOOLCHAIN_FILE}")
1724

1825
find_package(SDL3 CONFIG REQUIRED)
26+
find_package(CURL REQUIRED)
27+
find_package(nlohmann_json CONFIG REQUIRED)
28+
29+
include_directories(${CURL_INCLUDE_DIRS})
30+
1931
target_link_libraries(EncounterMaster PRIVATE
2032
SDL3::SDL3
33+
CURL::libcurl
34+
nlohmann_json::nlohmann_json
2135
)

Creature.cpp

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#include "Creature.h"
2+
#include <fstream>
3+
#include <SDL3/SDL.h>
4+
5+
dnd::Creature parse_creature(const json& j) {
6+
dnd::Creature creature;
7+
// Main fields
8+
creature.set_name(j.value("name", ""));
9+
creature.set_meta(j.value("meta", ""));
10+
11+
// Stats
12+
creature.set_armor_class(j.value("armor_class", ""));
13+
creature.set_hit_points(j.value("hit_points", ""));
14+
creature.set_speed(j.value("speed", ""));
15+
creature.set_str(j.value("str", ""));
16+
creature.set_str_mod(j.value("str_mod", ""));
17+
creature.set_dex(j.value("dex", ""));
18+
creature.set_dex_mod(j.value("dex_mod", ""));
19+
creature.set_con(j.value("con", ""));
20+
creature.set_con_mod(j.value("con_mod", ""));
21+
creature.set_creature_int(j.value("int", ""));
22+
creature.set_int_mod(j.value("int_mod", ""));
23+
creature.set_wis(j.value("wis", ""));
24+
creature.set_wis_mod(j.value("wis_mod", ""));
25+
creature.set_cha(j.value("cha", ""));
26+
creature.set_cha_mod(j.value("cha_mod", ""));
27+
28+
// Other fields
29+
creature.set_saving_throws(j.value("saving_throws", ""));
30+
31+
creature.set_skills(j.value("skills", ""));
32+
creature.set_senses(j.value("senses", ""));
33+
creature.set_languages(j.value("languages", ""));
34+
creature.set_challenge(j.value("challenge", ""));
35+
36+
// Actions and traits
37+
creature.set_traits(j.value("traits", ""));
38+
creature.set_actions(j.value("actions", ""));
39+
creature.set_legendary_actions(j.value("legendary_actions", ""));
40+
41+
// Image URL
42+
creature.set_img_url(j.value("img_url", ""));
43+
44+
// Combat-related fields
45+
creature.set_damage_immunities(j.value("damage_immunities", ""));
46+
creature.set_condition_immunities(j.value("condition_immunities", ""));
47+
creature.set_damage_resistances(j.value("damage_resistances", ""));
48+
creature.set_damage_vulnerabilities(j.value("damage_vulnerabilities", ""));
49+
creature.set_reactions(j.value("reactions", ""));
50+
51+
return creature;
52+
}
53+
54+
std::vector<dnd::Creature> parse_creatures_from_file(
55+
const std::string& filename) {
56+
std::ifstream f(filename);
57+
58+
using json = nlohmann::json;
59+
60+
auto startTime = SDL_GetTicks();
61+
json j;
62+
try {
63+
j = json::parse(f);
64+
}
65+
catch (const json::parse_error& e) {
66+
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "JSON parse error in file %s: %s",
67+
filename.c_str(), e.what());
68+
return {};
69+
}
70+
71+
auto endTime = SDL_GetTicks();
72+
73+
SDL_Log("Time taken to parse JSON: %u ms", endTime - startTime);
74+
std::vector<dnd::Creature> creatures;
75+
for (const auto& item : j) {
76+
creatures.push_back(parse_creature(item));
77+
}
78+
79+
return creatures;
80+
}
81+
82+
std::vector<dnd::Creature> parse_creatures_from_directory(
83+
const std::string& directory) {
84+
std::vector<dnd::Creature> all_creatures;
85+
for (const auto& entry : std::filesystem::directory_iterator(directory)) {
86+
if (entry.path().extension() == ".json") {
87+
auto creatures = parse_creatures_from_file(entry.path().string());
88+
all_creatures.insert(all_creatures.end(), creatures.begin(),
89+
creatures.end());
90+
}
91+
}
92+
93+
return all_creatures;
94+
}

Creature.h

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
#ifndef CREATURE_H
2+
#define CREATURE_H
3+
4+
#include <nlohmann/json.hpp>
5+
6+
#include <optional>
7+
#include <regex>
8+
#include <stdexcept>
9+
10+
class CreatureElement {
11+
public:
12+
CreatureElement() = default;
13+
virtual ~CreatureElement() = default;
14+
15+
private:
16+
std::optional<std::string> name;
17+
std::optional<std::string> meta;
18+
std::optional<std::string> armor_class;
19+
std::optional<std::string> hit_points;
20+
std::optional<std::string> speed;
21+
std::optional<std::string> str;
22+
std::optional<std::string> str_mod;
23+
std::optional<std::string> dex;
24+
std::optional<std::string> dex_mod;
25+
std::optional<std::string> con;
26+
std::optional<std::string> con_mod;
27+
std::optional<std::string> creature_int;
28+
std::optional<std::string> int_mod;
29+
std::optional<std::string> wis;
30+
std::optional<std::string> wis_mod;
31+
std::optional<std::string> cha;
32+
std::optional<std::string> cha_mod;
33+
std::optional<std::string> saving_throws;
34+
std::optional<std::string> skills;
35+
std::optional<std::string> senses;
36+
std::optional<std::string> languages;
37+
std::optional<std::string> challenge;
38+
std::optional<std::string> traits;
39+
std::optional<std::string> actions;
40+
std::optional<std::string> legendary_actions;
41+
std::optional<std::string> img_url;
42+
std::optional<std::string> damage_immunities;
43+
std::optional<std::string> condition_immunities;
44+
std::optional<std::string> damage_resistances;
45+
std::optional<std::string> damage_vulnerabilities;
46+
std::optional<std::string> reactions;
47+
48+
public:
49+
std::optional<std::string> get_name() const { return name; }
50+
void set_name(std::optional<std::string> value) { this->name = value; }
51+
52+
std::optional<std::string> get_meta() const { return meta; }
53+
void set_meta(std::optional<std::string> value) { this->meta = value; }
54+
55+
std::optional<std::string> get_armor_class() const { return armor_class; }
56+
void set_armor_class(std::optional<std::string> value) {
57+
this->armor_class = value;
58+
}
59+
60+
std::optional<std::string> get_hit_points() const { return hit_points; }
61+
void set_hit_points(std::optional<std::string> value) {
62+
this->hit_points = value;
63+
}
64+
65+
std::optional<std::string> get_speed() const { return speed; }
66+
void set_speed(std::optional<std::string> value) { this->speed = value; }
67+
68+
std::optional<std::string> get_str() const { return str; }
69+
void set_str(std::optional<std::string> value) { this->str = value; }
70+
71+
std::optional<std::string> get_str_mod() const { return str_mod; }
72+
void set_str_mod(std::optional<std::string> value) { this->str_mod = value; }
73+
74+
std::optional<std::string> get_dex() const { return dex; }
75+
void set_dex(std::optional<std::string> value) { this->dex = value; }
76+
77+
std::optional<std::string> get_dex_mod() const { return dex_mod; }
78+
void set_dex_mod(std::optional<std::string> value) { this->dex_mod = value; }
79+
80+
std::optional<std::string> get_con() const { return con; }
81+
void set_con(std::optional<std::string> value) { this->con = value; }
82+
83+
std::optional<std::string> get_con_mod() const { return con_mod; }
84+
void set_con_mod(std::optional<std::string> value) { this->con_mod = value; }
85+
86+
std::optional<std::string> get_creature_int() const { return creature_int; }
87+
void set_creature_int(std::optional<std::string> value) {
88+
this->creature_int = value;
89+
}
90+
91+
std::optional<std::string> get_int_mod() const { return int_mod; }
92+
void set_int_mod(std::optional<std::string> value) { this->int_mod = value; }
93+
94+
std::optional<std::string> get_wis() const { return wis; }
95+
void set_wis(std::optional<std::string> value) { this->wis = value; }
96+
97+
std::optional<std::string> get_wis_mod() const { return wis_mod; }
98+
void set_wis_mod(std::optional<std::string> value) { this->wis_mod = value; }
99+
100+
std::optional<std::string> get_cha() const { return cha; }
101+
void set_cha(std::optional<std::string> value) { this->cha = value; }
102+
103+
std::optional<std::string> get_cha_mod() const { return cha_mod; }
104+
void set_cha_mod(std::optional<std::string> value) { this->cha_mod = value; }
105+
106+
std::optional<std::string> get_saving_throws() const { return saving_throws; }
107+
void set_saving_throws(std::optional<std::string> value) {
108+
this->saving_throws = value;
109+
}
110+
111+
std::optional<std::string> get_skills() const { return skills; }
112+
void set_skills(std::optional<std::string> value) { this->skills = value; }
113+
114+
std::optional<std::string> get_senses() const { return senses; }
115+
void set_senses(std::optional<std::string> value) { this->senses = value; }
116+
117+
std::optional<std::string> get_languages() const { return languages; }
118+
void set_languages(std::optional<std::string> value) {
119+
this->languages = value;
120+
}
121+
122+
std::optional<std::string> get_challenge() const { return challenge; }
123+
void set_challenge(std::optional<std::string> value) {
124+
this->challenge = value;
125+
}
126+
127+
std::optional<std::string> get_traits() const { return traits; }
128+
void set_traits(std::optional<std::string> value) { this->traits = value; }
129+
130+
std::optional<std::string> get_actions() const { return actions; }
131+
void set_actions(std::optional<std::string> value) { this->actions = value; }
132+
133+
std::optional<std::string> get_legendary_actions() const {
134+
return legendary_actions;
135+
}
136+
void set_legendary_actions(std::optional<std::string> value) {
137+
this->legendary_actions = value;
138+
}
139+
140+
std::optional<std::string> get_img_url() const { return img_url; }
141+
void set_img_url(std::optional<std::string> value) { this->img_url = value; }
142+
143+
std::optional<std::string> get_damage_immunities() const {
144+
return damage_immunities;
145+
}
146+
void set_damage_immunities(std::optional<std::string> value) {
147+
this->damage_immunities = value;
148+
}
149+
150+
std::optional<std::string> get_condition_immunities() const {
151+
return condition_immunities;
152+
}
153+
void set_condition_immunities(std::optional<std::string> value) {
154+
this->condition_immunities = value;
155+
}
156+
157+
std::optional<std::string> get_damage_resistances() const {
158+
return damage_resistances;
159+
}
160+
void set_damage_resistances(std::optional<std::string> value) {
161+
this->damage_resistances = value;
162+
}
163+
164+
std::optional<std::string> get_damage_vulnerabilities() const {
165+
return damage_vulnerabilities;
166+
}
167+
void set_damage_vulnerabilities(std::optional<std::string> value) {
168+
this->damage_vulnerabilities = value;
169+
}
170+
171+
std::optional<std::string> get_reactions() const { return reactions; }
172+
void set_reactions(std::optional<std::string> value) {
173+
this->reactions = value;
174+
}
175+
};
176+
177+
namespace dnd {
178+
using Creature = CreatureElement;
179+
}
180+
181+
using json = nlohmann::json;
182+
183+
dnd::Creature parse_creature(const json& j);
184+
185+
std::vector<dnd::Creature> parse_creatures_from_file(const std::string& filename);
186+
187+
std::vector<dnd::Creature> parse_creatures_from_directory(
188+
const std::string& directory);
189+
190+
#endif

0 commit comments

Comments
 (0)