diff options
-rw-r--r-- | generator.cpp | 24 | ||||
-rw-r--r-- | generator.h | 43 | ||||
-rw-r--r-- | main.cpp | 44 | ||||
-rw-r--r-- | paintings.txt | 29 |
4 files changed, 139 insertions, 1 deletions
diff --git a/generator.cpp b/generator.cpp index 6b6c1be..8334904 100644 --- a/generator.cpp +++ b/generator.cpp | |||
@@ -654,6 +654,30 @@ void Generator::GenerateCrossTower( | |||
654 | SavePanel(west_other_name3, sets[3][3], sets[3][3]); | 654 | SavePanel(west_other_name3, sets[3][3], sets[3][3]); |
655 | } | 655 | } |
656 | 656 | ||
657 | void Generator::GeneratePaintingPuzzle(std::string panel_name, std::string painting_name) { | ||
658 | std::string node_name; | ||
659 | std::string answer; | ||
660 | int resource_id = 0; | ||
661 | |||
662 | for (;;) { | ||
663 | std::tie(node_name, answer, resource_id) = paintings_->GetPainting(rng_); | ||
664 | if (!used_paintings_.count(node_name)) { | ||
665 | break; | ||
666 | } | ||
667 | } | ||
668 | |||
669 | used_paintings_.insert(node_name); | ||
670 | |||
671 | SavePanel(panel_name, "painting", answer, {}); | ||
672 | |||
673 | std::string resource_path = std::string("res://nodes/paintings/") + node_name + ".tscn"; | ||
674 | if (resource_id == 0) { | ||
675 | resources_.emplace_back(resource_path, "PackedScene"); | ||
676 | } | ||
677 | |||
678 | replace_nodes_[painting_name] = {resource_path, resource_id}; | ||
679 | } | ||
680 | |||
657 | void Generator::SavePanel(std::string name, std::string question, std::string answer, GenerateOptions options) { | 681 | void Generator::SavePanel(std::string name, std::string question, std::string answer, GenerateOptions options) { |
658 | if (options.save_for_later) { | 682 | if (options.save_for_later) { |
659 | reusable_.push_back(answer); | 683 | reusable_.push_back(answer); |
diff --git a/generator.h b/generator.h index 7803004..d0333a6 100644 --- a/generator.h +++ b/generator.h | |||
@@ -118,6 +118,25 @@ private: | |||
118 | std::vector<std::vector<std::string>> sets_; | 118 | std::vector<std::vector<std::string>> sets_; |
119 | }; | 119 | }; |
120 | 120 | ||
121 | class Paintings { | ||
122 | public: | ||
123 | explicit Paintings(std::string filename) { | ||
124 | std::ifstream file(filename); | ||
125 | std::string line; | ||
126 | while (std::getline(file, line)) { | ||
127 | auto parts = hatkirby::split<std::vector<std::string>>(line, ","); | ||
128 | paintings_.emplace_back(parts[0], parts[1], std::atoi(parts[2].c_str())); | ||
129 | } | ||
130 | } | ||
131 | |||
132 | const std::tuple<std::string, std::string, int>& GetPainting(std::mt19937& rng) const { | ||
133 | return paintings_.at(std::uniform_int_distribution<int>(0, paintings_.size()-1)(rng)); | ||
134 | } | ||
135 | |||
136 | private: | ||
137 | std::vector<std::tuple<std::string, std::string, int>> paintings_; | ||
138 | }; | ||
139 | |||
121 | class Generator { | 140 | class Generator { |
122 | public: | 141 | public: |
123 | 142 | ||
@@ -125,6 +144,7 @@ public: | |||
125 | database_ = std::make_unique<verbly::database>("/Users/hatkirby/Dropbox/Programming/verbly-datafiles/d1.3_lingo7"); | 144 | database_ = std::make_unique<verbly::database>("/Users/hatkirby/Dropbox/Programming/verbly-datafiles/d1.3_lingo7"); |
126 | wanderlust_ = std::make_unique<Wanderlust>("../wanderlust_words.txt", "../wanderlust_puzzles.txt"); | 145 | wanderlust_ = std::make_unique<Wanderlust>("../wanderlust_words.txt", "../wanderlust_puzzles.txt"); |
127 | cross_tower_ = std::make_unique<CrossTower>("../cross_tower.txt"); | 146 | cross_tower_ = std::make_unique<CrossTower>("../cross_tower.txt"); |
147 | paintings_ = std::make_unique<Paintings>("../paintings.txt"); | ||
128 | } | 148 | } |
129 | 149 | ||
130 | // Querying | 150 | // Querying |
@@ -136,6 +156,18 @@ public: | |||
136 | return panels_.at(name); | 156 | return panels_.at(name); |
137 | } | 157 | } |
138 | 158 | ||
159 | bool IsNodeRandomized(const std::string& name) const { | ||
160 | return replace_nodes_.count(name); | ||
161 | } | ||
162 | |||
163 | const std::tuple<std::string, int>& GetNode(const std::string& name) const { | ||
164 | return replace_nodes_.at(name); | ||
165 | } | ||
166 | |||
167 | const std::vector<std::tuple<std::string, std::string>>& GetResources() const { | ||
168 | return resources_; | ||
169 | } | ||
170 | |||
139 | // Sets the panel's question and answer to static values. | 171 | // Sets the panel's question and answer to static values. |
140 | void GenerateStaticPanel(std::string name, std::string question, std::string answer = ""); | 172 | void GenerateStaticPanel(std::string name, std::string question, std::string answer = ""); |
141 | 173 | ||
@@ -196,6 +228,9 @@ public: | |||
196 | std::string west_other_name2, | 228 | std::string west_other_name2, |
197 | std::string west_other_name3); | 229 | std::string west_other_name3); |
198 | 230 | ||
231 | // Generate a painting/panel pair. | ||
232 | void GeneratePaintingPuzzle(std::string panel_name, std::string painting_name); | ||
233 | |||
199 | private: | 234 | private: |
200 | 235 | ||
201 | verbly::filter MakeHintFilter(verbly::filter subfilter, Height height, Colour colour, FilterDirection filter_direction) const; | 236 | verbly::filter MakeHintFilter(verbly::filter subfilter, Height height, Colour colour, FilterDirection filter_direction) const; |
@@ -223,12 +258,20 @@ private: | |||
223 | std::unique_ptr<verbly::database> database_; | 258 | std::unique_ptr<verbly::database> database_; |
224 | std::unique_ptr<Wanderlust> wanderlust_; | 259 | std::unique_ptr<Wanderlust> wanderlust_; |
225 | std::unique_ptr<CrossTower> cross_tower_; | 260 | std::unique_ptr<CrossTower> cross_tower_; |
261 | std::unique_ptr<Paintings> paintings_; | ||
226 | 262 | ||
227 | // name, question, answer | 263 | // name, question, answer |
228 | std::map<std::string, std::tuple<std::string, std::string>> panels_; | 264 | std::map<std::string, std::tuple<std::string, std::string>> panels_; |
229 | 265 | ||
266 | // name, resource_path, resource_id (0 if needs import) | ||
267 | std::map<std::string, std::tuple<std::string, int>> replace_nodes_; | ||
268 | |||
269 | // path, type | ||
270 | std::vector<std::tuple<std::string, std::string>> resources_; | ||
271 | |||
230 | std::vector<std::string> reusable_; | 272 | std::vector<std::string> reusable_; |
231 | std::map<std::string, std::set<std::string>> pools_; | 273 | std::map<std::string, std::set<std::string>> pools_; |
274 | std::set<std::string> used_paintings_; | ||
232 | }; | 275 | }; |
233 | 276 | ||
234 | #endif /* end of include guard: GENERATOR_H_811386CE */ | 277 | #endif /* end of include guard: GENERATOR_H_811386CE */ |
diff --git a/main.cpp b/main.cpp index 505004d..ba40def 100644 --- a/main.cpp +++ b/main.cpp | |||
@@ -405,7 +405,12 @@ public: | |||
405 | 405 | ||
406 | 406 | ||
407 | 407 | ||
408 | 408 | // Room Room | |
409 | gen_.GeneratePaintingPuzzle("Panel_painting_flower", "flower_painting_gray"); | ||
410 | gen_.GeneratePaintingPuzzle("Panel_painting_eye", "eye_painting_gray"); | ||
411 | gen_.GeneratePaintingPuzzle("Panel_painting_snowman", "snowman_painting_gray"); | ||
412 | gen_.GeneratePaintingPuzzle("Panel_painting_owl", "owl_painting_gray"); | ||
413 | gen_.GeneratePaintingPuzzle("Panel_painting_panda", "panda_painting_gray"); | ||
409 | 414 | ||
410 | 415 | ||
411 | 416 | ||
@@ -578,6 +583,9 @@ public: | |||
578 | std::string name; | 583 | std::string name; |
579 | std::string question; | 584 | std::string question; |
580 | std::string answer; | 585 | std::string answer; |
586 | std::map<std::string, int> resource_id_by_path; | ||
587 | int last_id = 0; | ||
588 | bool need_to_output_resources = false; | ||
581 | while (std::getline(level1, line)) { | 589 | while (std::getline(level1, line)) { |
582 | if (line.substr(0, 18) == "[node name=\"Panel_") { | 590 | if (line.substr(0, 18) == "[node name=\"Panel_") { |
583 | std::string stripstart = line.substr(12); | 591 | std::string stripstart = line.substr(12); |
@@ -604,6 +612,40 @@ public: | |||
604 | 612 | ||
605 | //std::cout << name << ": " << question << "? " << answer << "!" << std::endl; | 613 | //std::cout << name << ": " << question << "? " << answer << "!" << std::endl; |
606 | output << "answer = \"" << answer << "\"" << std::endl; | 614 | output << "answer = \"" << answer << "\"" << std::endl; |
615 | } else if (line.substr(0, 9) == "[gd_scene") { | ||
616 | std::string stripstart = line.substr(21); | ||
617 | std::string numstr = stripstart.substr(0, stripstart.find(" ")); | ||
618 | int load_steps = std::atoi(numstr.c_str()); | ||
619 | output << "[gd_scene load_steps=" << (load_steps + gen_.GetResources().size()) << " format=2]\n"; | ||
620 | } else if (line.substr(0, 13) == "[ext_resource") { | ||
621 | std::string stripstart = line.substr(line.find("id=") + 3); | ||
622 | std::string numstr = stripstart.substr(0, stripstart.find("]")); | ||
623 | last_id = std::atoi(numstr.c_str()); | ||
624 | need_to_output_resources = true; | ||
625 | output << line << "\n"; | ||
626 | } else if (line.substr(0, 12) == "[node name=\"") { | ||
627 | std::string stripstart = line.substr(12); | ||
628 | std::string tempname = stripstart.substr(0, stripstart.find("\"")); | ||
629 | |||
630 | if (gen_.IsNodeRandomized(tempname)) { | ||
631 | int id_pos = line.find("(") + 2; | ||
632 | auto [path, res_id] = gen_.GetNode(tempname); | ||
633 | if (res_id != 0) { | ||
634 | output << line.substr(0, id_pos) + std::to_string(res_id) + " )]\n"; | ||
635 | } else { | ||
636 | output << line.substr(0, id_pos) + std::to_string(resource_id_by_path[path]) + " )]\n"; | ||
637 | } | ||
638 | } else { | ||
639 | output << line << "\n"; | ||
640 | } | ||
641 | } else if (line.empty() && need_to_output_resources) { | ||
642 | for (const auto& [path, type] : gen_.GetResources()) { | ||
643 | last_id++; | ||
644 | resource_id_by_path[path] = last_id; | ||
645 | output << "[ext_resource path=\"" << path << "\" type=\"" << type << "\" id=" << last_id << "]\n"; | ||
646 | } | ||
647 | output << "\n"; | ||
648 | need_to_output_resources = false; | ||
607 | } else { | 649 | } else { |
608 | output << line << "\n"; | 650 | output << line << "\n"; |
609 | } | 651 | } |
diff --git a/paintings.txt b/paintings.txt new file mode 100644 index 0000000..f91a808 --- /dev/null +++ b/paintings.txt | |||
@@ -0,0 +1,29 @@ | |||
1 | beach,beach,0 | ||
2 | bg_bg4,clouds,0 | ||
3 | bg_bookshelf,bookshelf,0 | ||
4 | bg_candle,candle,0 | ||
5 | bg_egg,egg,0 | ||
6 | bg_fish,fish,0 | ||
7 | bg_halloween_2,pumpkin,0 | ||
8 | bg_knight,knight,0 | ||
9 | bg_scorpion,scorpion,0 | ||
10 | bg_thanksgiving,turkey,0 | ||
11 | catlike,cat,0 | ||
12 | crown,crown,0 | ||
13 | emmy,nest,0 | ||
14 | ether,rocket ship,0 | ||
15 | hatkirby,shooting star,0 | ||
16 | icy,parrot,0 | ||
17 | ig_note,note,0 | ||
18 | ig_rose,rose,0 | ||
19 | kiwi,kiwi,0 | ||
20 | ninjonicx_square,spiral,0 | ||
21 | rainbow,rainbow,0 | ||
22 | rever,fishbowl,0 | ||
23 | tree,tree,0 | ||
24 | yinyang,yinyang,0 | ||
25 | eight,eight,59 | ||
26 | north,north,44 | ||
27 | east,east,48 | ||
28 | south,south,47 | ||
29 | west,west,46 \ No newline at end of file | ||