53 const std::string& command) {
54 std::vector<AIAction> actions;
56 std::string cmd_lower = command;
57 std::transform(cmd_lower.begin(), cmd_lower.end(), cmd_lower.begin(), ::tolower);
60 std::map<std::string, std::string> params;
84 if (absl::StrContains(cmd_lower,
"click") || absl::StrContains(cmd_lower,
"press")) {
85 std::regex button_pattern(R
"((save|load|export|import|open)\s+(\w+))", std::regex::icase);
87 if (std::regex_search(command, match, button_pattern)) {
88 params[
"button"] = match[1].str() +
" " + match[2].str();
94 return absl::InvalidArgumentError(
95 absl::StrCat(
"Could not parse AI command: ", command));
153 const std::string& command,
154 std::map<std::string, std::string>* params) {
155 std::string cmd_lower = command;
156 std::transform(cmd_lower.begin(), cmd_lower.end(), cmd_lower.begin(), ::tolower);
158 if (!absl::StrContains(cmd_lower,
"place") &&
159 !absl::StrContains(cmd_lower,
"put") &&
160 !absl::StrContains(cmd_lower,
"set")) {
164 if (!absl::StrContains(cmd_lower,
"tile")) {
169 std::regex tile_pattern(R
"(tile\s+(?:id\s+)?(0x[0-9a-fA-F]+|\d+))", std::regex::icase);
172 if (std::regex_search(command, match, tile_pattern)) {
174 int tile_id = ParseHexOrDecimal(match[1].str());
175 (*params)[
"tile_id"] = std::to_string(tile_id);
185 if (ExtractCoordinates(command, &x, &y)) {
186 (*params)[
"x"] = std::to_string(x);
187 (*params)[
"y"] = std::to_string(y);
193 std::regex map_pattern(R
"((?:map|overworld)\s+(?:id\s+)?(\d+))", std::regex::icase);
194 if (std::regex_search(command, match, map_pattern)) {
195 (*params)[
"map_id"] = match[1].str();
197 (*params)[
"map_id"] =
"0";
204 const std::string& command,
205 std::map<std::string, std::string>* params) {
206 std::string cmd_lower = command;
207 std::transform(cmd_lower.begin(), cmd_lower.end(), cmd_lower.begin(), ::tolower);
209 if (!absl::StrContains(cmd_lower,
"select") &&
210 !absl::StrContains(cmd_lower,
"choose") &&
211 !absl::StrContains(cmd_lower,
"pick")) {
215 if (!absl::StrContains(cmd_lower,
"tile")) {
220 std::regex tile_pattern(R
"(tile\s+(?:id\s+)?(0x[0-9a-fA-F]+|\d+))", std::regex::icase);
223 if (std::regex_search(command, match, tile_pattern)) {
225 int tile_id = ParseHexOrDecimal(match[1].str());
226 (*params)[
"tile_id"] = std::to_string(tile_id);
237 const std::string& command,
238 std::map<std::string, std::string>* params) {
239 std::string cmd_lower = command;
240 std::transform(cmd_lower.begin(), cmd_lower.end(), cmd_lower.begin(), ::tolower);
242 if (!absl::StrContains(cmd_lower,
"open") &&
243 !absl::StrContains(cmd_lower,
"launch") &&
244 !absl::StrContains(cmd_lower,
"start")) {
248 if (absl::StrContains(cmd_lower,
"overworld")) {
249 (*params)[
"editor"] =
"overworld";
253 if (absl::StrContains(cmd_lower,
"dungeon")) {
254 (*params)[
"editor"] =
"dungeon";
258 if (absl::StrContains(cmd_lower,
"sprite")) {
259 (*params)[
"editor"] =
"sprite";
263 if (absl::StrContains(cmd_lower,
"tile16") || absl::StrContains(cmd_lower,
"tile 16")) {
264 (*params)[
"editor"] =
"tile16";