| 466 | } |
| 467 | |
| 468 | command_result Commands::sc_script(color_ostream& con, Core& core, const std::string& first, const std::vector<std::string>& parts) |
| 469 | { |
| 470 | if (parts.empty() || parts[0] == "help" || parts[0] == "?") |
| 471 | { |
| 472 | con << "Usage: sc-script add|remove|list|help SC_EVENT [path-to-script] [...]" << std::endl; |
| 473 | con << "Valid event names (SC_ prefix is optional):" << std::endl; |
| 474 | for (int i = SC_WORLD_LOADED; i <= SC_UNPAUSED; i++) |
| 475 | { |
| 476 | std::string name = sc_event_name((state_change_event)i); |
| 477 | if (name != "SC_UNKNOWN") |
| 478 | con << " " << name << std::endl; |
| 479 | } |
| 480 | return CR_OK; |
| 481 | } |
| 482 | else if (parts[0] == "list") |
| 483 | { |
| 484 | std::string event_name = parts.size() >= 2 ? parts[1] : ""; |
| 485 | if (event_name.size() && sc_event_id(event_name) == SC_UNKNOWN) |
| 486 | { |
| 487 | con << "Unrecognized event name: " << parts[1] << std::endl; |
| 488 | return CR_WRONG_USAGE; |
| 489 | } |
| 490 | for (const auto& state_script : core.getStateChangeScripts()) |
| 491 | { |
| 492 | if (!parts[1].size() || (state_script.event == sc_event_id(parts[1]))) |
| 493 | { |
| 494 | con.print("{} ({}): {}{}\n", sc_event_name(state_script.event), |
| 495 | state_script.save_specific ? "save-specific" : "global", |
| 496 | state_script.save_specific ? "<save folder>/raw/" : "<DF folder>/", |
| 497 | state_script.path); |
| 498 | } |
| 499 | } |
| 500 | return CR_OK; |
| 501 | } |
| 502 | else if (parts[0] == "add") |
| 503 | { |
| 504 | if (parts.size() < 3 || (parts.size() >= 4 && parts[3] != "-save")) |
| 505 | { |
| 506 | con << "Usage: sc-script add EVENT path-to-script [-save]" << std::endl; |
| 507 | return CR_WRONG_USAGE; |
| 508 | } |
| 509 | state_change_event evt = sc_event_id(parts[1]); |
| 510 | if (evt == SC_UNKNOWN) |
| 511 | { |
| 512 | con << "Unrecognized event: " << parts[1] << std::endl; |
| 513 | return CR_FAILURE; |
| 514 | } |
| 515 | bool save_specific = (parts.size() >= 4 && parts[3] == "-save"); |
| 516 | StateChangeScript script(evt, parts[2], save_specific); |
| 517 | for (const auto& state_script : core.getStateChangeScripts()) |
| 518 | { |
| 519 | if (script == state_script) |
| 520 | { |
| 521 | con << "Script already registered" << std::endl; |
| 522 | return CR_FAILURE; |
| 523 | } |
| 524 | } |
| 525 | core.addStateChangeScript(script); |