* add node subtype for container names
* clean up and port changes to qtFRED
* fix parsing when container is the last argument
* fix serializing container name nodes
* fix parsing again
* disallow spaces in container names
* check for spaces and & chars while parsing container names
* early WIP for trying to get list containers of strings working as argument options
* indicate which SEXPs will be supported for now
* clean up
* add FRED/qtFRED support
* remove [in]validate-argument from supported SEXPs
* support map containers with string keys
* update FRED and qtFRED
* clean up
* update FRED help text
* revert some unneeded changes
* fix style
* remove added assertion
* backport useful changes from PR #4263 and then some
* clean up backport
* move condition_node evaluation outside of argument loop
* fix does_blank_of_op_support_container_args()
* fix assertion
* add OPF_DATA_OR_STR_CONTAINER and use restore old behavior of OPF_ANYTHING
* revert some unnecessary changes
* fix CI
* detect attempts to modify container while it is being used as special argument (WIP)
* evaluate conditional for each loop
* update placeholder text for new SEXP arg type
* finish/clean up
* add subsystem indexer and ensure that ship_get_indexed_subsys and ship_get_first_subsys are independent
* also add reverse lookup from subsys to index
* update indexer to accommodate subsystem pointers being changed
* use clearer function names, and fix the type of subsys_list_indexer
* add assertions
* address latest feedbcak
1) In `for-counter`, when `just_count` is true there is a memory leak, since the code never enters `test_argument_vector_for_condition`, but for the same reason, duplicating the string is not necessary in that case, so just add a blank string
2) Remove unnecessary `vm_strdup` calls from the other for-* operators
3) `const`ify argument management
Alt-names with hashes that were added by the `change-alt-name` sexp used to have their hashes truncated properly. This most likely broke when hash truncation was moved from the HUD code to the "display name" code. This PR truncates hashes in the same way as truncation elsewhere.
* Avoid setting .rest for Locked_sexp_true/false with malformed SEXPs.
When FRED puts a `true` in the middle of a list of arguments, it wraps it in a nested list as `(true)`, because it's technically an operator; however, if someone writes a SEXP by hand, they could easily forget to do this, and in such cases, this causes `Locked_sexp_true` to be inserted into the middle of the list. If it's not the last element of the list, it will then have its `.rest` attribute set to the next node in the list. If this is a temporary SEXP (i.e. from Lua's `runSEXP()` function), this used to be a temporary problem, but PR #4088 changed the global search for any node with `.rest` set to the node being freed to require an explicit parent node. This means that `Locked_sexp_true.rest` remains set to a freed node, which can cause further issues. If such a malformed SEXP *isn't* temporary it can cause even more issues, even pre-#4088.
This commit changes `get_sexp()` so that if it detects `true` or `false` in the middle of a list (and not a single-element list), it will put it into a single-element sub-list, hopefully preventing any modification of `Locked_sexp_true` or `Locked_sexp_false`, as giving a `Warning`. This should cause it to behave as though `true` or `false` was actually `(true)` or `(false)`, respectively, and therefore run as expected.
* Add comment and remove unused variable declaration.
Thanks to @PhantomHoover for the wording on the comment.
* Fix RTT Cockpits Gauges with Change Ship Class
Previously, using the `change-ship-class` sexp or scripting function did not update RTT cockpit gauges. This PR adds the cockpit code update functions to fix the issue. Tested and works as expected.
* comment consistency
Followup to #4088. A few calls of `free_sexp` (especially in `free_sexp2`) did not supply the calling node, which left inconsistent SEXP tree structures and caused a crash in TranscendE1M6. This fixes the crash and fills in some of these places.
* Add a flag to allow the firing fail sound to play with locked primaries
* Adds an equivalent flag for Secondaries
* Make the flags accessible to FRED
* Fix whitespace mistakes
* Yet another whitespace fix
* Move primary fail sound flag check up to avoid wasting processing with unused shots
* Move secondary locked check up to avoid doing unnecessary checks
PR #3750 made `check_sexp_syntax()` less permissive of node trees containing `<argument>`, which causes problems given that FRED saves `modify-variable`'s second argument as a `SEXP_ATOM_NUMBER`, as now `check_sexp_syntax()` complains that `<argument>` isn't a valid number. This commit both makes the `SEXP_ATOM_NUMBER` check skip the number validation logic if the `SNF_SPECIAL_ARG_IN_NODE` flag is set, as well as removing the `SEXP_ATOM_STRING` type check from the later `SNF_SPECIAL_ARG_IN_NODE` check (for making sure it's inside an `-argument` SEXP).