|  |  |  | #include "ai.hpp"
 | 
					
						
							|  |  |  | #include "ai_debug.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace ai {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /*
 | 
					
						
							|  |  |  |    * Yeah this is weird but it's only to debug things like
 | 
					
						
							|  |  |  |    * the preconditions which are weirdly done.
 | 
					
						
							|  |  |  |    */
 | 
					
						
							|  |  |  |   void dump_only(State state, bool matching, bool show_as) {
 | 
					
						
							|  |  |  |     AIProfile* profile = ai::profile();
 | 
					
						
							|  |  |  |     for(auto& [name, name_id] : *profile) {
 | 
					
						
							|  |  |  |       if(state.test(name_id) == matching) {
 | 
					
						
							|  |  |  |         fmt::println("\t{}={}", name, show_as);
 | 
					
						
							|  |  |  |       }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void dump_state(State state) {
 | 
					
						
							|  |  |  |     AIProfile* profile = ai::profile();
 | 
					
						
							|  |  |  |     for(auto& [name, name_id] : *profile) {
 | 
					
						
							|  |  |  |       fmt::println("\t{}={}", name,
 | 
					
						
							|  |  |  |           state.test(name_id));
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void dump_action(Action& action) {
 | 
					
						
							|  |  |  |     fmt::println(" --ACTION: {}, cost={}", action.name, action.cost);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fmt::println("   PRECONDS:");
 | 
					
						
							|  |  |  |     dump_only(action.$positive_preconds, true, true);
 | 
					
						
							|  |  |  |     dump_only(action.$negative_preconds, true, false);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fmt::println("   EFFECTS:");
 | 
					
						
							|  |  |  |     dump_only(action.$positive_effects, true, true);
 | 
					
						
							|  |  |  |     dump_only(action.$negative_effects, true, false);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   State dump_script(std::string msg, State start, Script& script) {
 | 
					
						
							|  |  |  |     fmt::println("--SCRIPT DUMP: {}", msg);
 | 
					
						
							|  |  |  |     fmt::println("# STATE BEFORE:");
 | 
					
						
							|  |  |  |     dump_state(start);
 | 
					
						
							|  |  |  |     fmt::print("% ACTIONS PLANNED:");
 | 
					
						
							|  |  |  |     for(auto& action : script) {
 | 
					
						
							|  |  |  |       fmt::print("{} ", action.name);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     fmt::print("\n");
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(auto& action : script) {
 | 
					
						
							|  |  |  |       dump_action(action);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       start = action.apply_effect(start);
 | 
					
						
							|  |  |  |       fmt::println(" ## STATE AFTER:");
 | 
					
						
							|  |  |  |       dump_state(start);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return start;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void EntityAI::dump() {
 | 
					
						
							|  |  |  |     dump_script(script, start, plan.script);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }
 |