In a few places where the game checks for the command sender, it should check for #Command as well, as long as the mission flag to override #Command is present.
Additionally, while the mission's command sender was originally intended to be a ship, it has been used to specify an alternative to #Command as well. But this caused problems when the "override #Command" mission flag was active, as it transformed a hashed source into a non-hashed source. So this commit adds a check to treat the source as hashed, if necessary, if a replacement has occurred.
Fixes#5749.
A mission in Mantle caused an invalid vector access when checking whether to vaporize a ship whose ship type was -1. Turns out having "no type" is actually allowed, so I audited all `class_type` accesses throughout the code for potential -1 accesses. Most were properly checked but a few were not. A few others needed to be tweaked.
(I suspect this is something that would be on the Coverity list if it isn't already.)
* Add stage notes feature for mission messages
* don't keep notes outside the mission editor
* use F_MULTITEXT and do lcl_replacements
* this should be multitext too
The `Random::next(low, high)` function returns a value in [low, high]. This location should use the single-argument version, `Random::next(int modulus)`, which returns a value in [0, modulus-1].
Personae have a flag and a species bitfield. They're built up during parsing, but never explicitly zeroed out. This leads to ships occasionally getting an incorrect persona (especially common with support ships, which never have an explicit persona).
Additionally, this commit addresses an issue with the UES Aranyaka (and potentially other support ships belonging to species without a support persona). I'm honestly not sure why they were ever able to speak; however, with this change, they'll never be able to. As such, this commit introduces a "default support persona" to retain the desired behavior.
* Fix intra-persona message borrowing logic
Closes#5299.
* Always assign personae for Support
Disabling the Auto_assign_personas flag had the side-effect of prohibiting support ships from ever speaking. Since a mod that wants this behavior (for whatever reason) can just not have a support persona, this commit makes an exception for them.
* Make Protect Target and Cover Me adaptive like Engage Enemy is
* Respect the allow subsitution flag
Historically, there's been a hardcoded 25% chance for Command to announce an enemy wing arrival. This is problematic for mods without Command, like BTA.
The logic used to select builtin messages was complex and hard to follow. This commit replaces it with logic that, while not identical, is both similar and more flexible. Additionally, the old logic had a major limitation when it came to downgrading messages: If a message type was defined for *any* persona, then it couldn't be downgraded for *any* persona. The new logic removes this limitation, and makes downgrade paths easier to define as well.
Some message types had hard-coded occurrence chances. These have been removed, and the default occurrence chance for the corresponding type modified to compensate.
Use a vector for storing the message queue so it can be whatever size the mission needs.
As part of this, add `free` and `vm_free` deleters to be usable with `unique_ptr` and enhance `insertion_sort` to be usable with vectors.
Fixes#4959.
When the code checks for the existence of an audio file, be sure to check all relevant extensions.
This fixes#4495. Tested with both ST:R personas as well as the Vasudan persona.
Before setting the `MQF_CONVERT_TO_COMMAND` flag, check to make sure the conversion will succeed.
This should ensure proper behavior for any case where command-conversion is needed. I've tested it with both a message that should not be converted and a message that should, and both behave as expected.
Follow-up to #4150 and #4078. Fixes#4356.
The FS1 behavior for converting wingmen messages to Command messages specifically applies to in-mission messages with multiple files corresponding to the possible senders. There is no situation where a built-in message needs to be converted, and in fact built-in messages can't usually be substituted because most built-in messages are distinct. This commit adds an extra check for that case. It has the effect of "fixing" #4149 even though that isn't really a bug.
FS1 has a feature which will occasionally convert a wingman message to a Command message. This adds a few more checks to that feature:
1) Make the command-conversion code and the alive-check code mutually exclusive;
2) If the filename is not a FS1-style persona, don't change either a) the filename, or b) the talking head
Fixes#3759.