-
Notifications
You must be signed in to change notification settings - Fork 0
/
FileReader.cpp
167 lines (156 loc) · 5.54 KB
/
FileReader.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
//
// Created by Jakub on 06/10/2017.
//
#include "FileReader.h"
#include "opponent.h"
#include "Statistics.h"
#include "Randomizer.h"
#include "arena.h"
#include "spawn_opponent.h"
#include <fstream>
abstractLocation* FileReader::jsonLoadLocation(const std::string &filename){
abstractLocation *location = nullptr;
Statistics::addLocations_visited();
std::ifstream stream(getPath() + filename);
nlohmann::json j;
stream >> j; //parse stream to json struct
std::string description_to_write; // string containing whole description
for (auto &desc_part : j["description"]){
description_to_write.append(desc_part);
description_to_write.append("\n");
}
if ((!j["type"].is_null()) && (j["type"] == "arena")){
if (j["waves"].is_number()){
location = new Arena(j["name"], description_to_write, j["waves"]);
}
else{
std::cout<<"Invalid arena parameter"<<std::endl;
}
}
else{
location = new Location(j["name"], description_to_write);
}
if (!j["teleport"].is_null()) {
std::string destination = j["teleport"];
location->setTeleportDestination(destination);
}
std::string the_path;
for (auto &character: j["characters"]) {
if (character["path"].is_string()) { // make sure path is a string
the_path = character["path"];
Character *character_one = jsonLoadCharacter(getPath() + the_path);
location->addCharacters(character_one);
}
}
return location;
}
Character *FileReader::jsonLoadCharacter(const std::string &filename) {
Statistics::addCharacters();
std::ifstream stream(filename);
nlohmann::json j;
stream >> j; //parse stream to json struct
Character *character;
if (j["type"].is_null()){
character = new Character(j["name"], j["description"]);
}
else if (j["type"] == "mob"){
character = new Opponent(j["name"], j["description"], j["strength"]);
}
else if (j["type"] == "gal"){
character = new Spawn(j["name"], j["description"], j["strength"]);
}
else{
character = nullptr;
std::cout<<"INVALID CHARACTER CREATION\n"<<std::endl;
}
std::vector<EventChain*> chain = jsonFormEvent(j["dialog"]);
character->setChain(chain);
if (!j["react"].is_null()){ // if there is some reaction to an item, then set it here
for (auto &reaction : j["react"]){
// add to character reactions_list
character->setMax_state(character->getMax_state()+1);
character->pushReaction(reaction);
}
}
return character;
}
std::vector<EventChain*> FileReader::jsonFormEvent(nlohmann::json dialog_options){
std::vector<EventChain*> events;
EventChain* temp_chain;
bool should_teleport = false;
int i, id;
std::string answer, question;
for (auto &dialog : dialog_options){
id = dialog["id"];
temp_chain = new EventChain(id);
i = 0;
Event *temp_event;
for (auto option : dialog["option"]){
answer = "";
question = "";
i++;
if (option["teleport"].is_boolean()){
should_teleport = option["teleport"];
}
if (option["answer"].is_array()) {
for (auto &line : option["answer"]) {
answer.append(line);
}
}
else{
answer = option["answer"];
}
if (option["question"].is_array()){
for (auto &line : option["question"]){
question.append(line);
}
}
else{
question = option["question"];
}
if ((option["item"].is_null()) && (option["effect"].is_null())){
// use standard constructor if no item given during the dialogue
temp_event = new Event(i, "dialog", question, answer);
temp_event->setTeleport(should_teleport);
}
else if (!option["item"].is_null()){
//if you get item during an event, check here
std::string possible_item = option["item"];
Statistics::addItems();
//this is done to avoid object type ambiguity in Event constructor
temp_event = new Event(i, "dialog", question, answer, possible_item);
temp_event->setTeleport(should_teleport);
if (!option["effect"].is_null()){
//set an effect here
int effect = option["effect"];
temp_event->setEffect(effect);
}
}
else {
// push if there is an effect
int effect = option["effect"];
// again explicit declaration of type, constructor indicator
temp_event = new Event(i, "dialog", question, answer, effect);
temp_event->setTeleport(should_teleport);
}
Statistics::addEvents();
temp_chain->pushChain(temp_event);
}
events.push_back(temp_chain);
}
return events;
}
FileReader::~FileReader(){
std::cout<<"Closing reading capabilities..."<<std::endl;
delete &path;
}
std::string FileReader::processHeroName() {
std::string hero_name;
std::cout<<"PLEASE ENTER NAME "<<std::endl;
std::cin>>hero_name;
while (hero_name.size() < 5){
std::cout<<"Name is too short, please reenter"<<std::endl;
std::cin>>hero_name;
}
return hero_name;
};