* feat: IW3 menu dumping
* fix: IW3 menu dumper preserve menu ownerdraw flag masks
* fix: IW3 menu dumper preserve numeric script arguments
Emit numeric tokens without quotes so the linker keeps colour arguments separate.
Before: `"0.1" "0.1" "0.12" "0.5"` becomes `"0.10.10.120.5"`
After: `0.1 0.1 0.12 0.5`
This fixes `mouseExit` colour commands failing to clear menu hover borders.
* fix: IW3 menu dumper preserve empty item text
Keep explicit empty text distinct from null text when dumping menu items.
This fixes CD-key values overflowing their input boxes.
* test: cover IW3 menu dumper material case
* test: cover IW3 menu list path precedence
* chore: clang format
* fix: reverse order of union to avoid edge case bug in zcg
* feat: IW3 menu loading
* fix: validate menu expression name table
* chore: explain numeric token quoting in comment
* refactor: simplify menu dump fallback path
* chore: add more dynamic window flags
* refactor: reuse IW3 menu window flag constants
* refactor: use explicit menu item feature lookup
* refactor: represent menu item text as optional
* refactor: clarify shared IW3 and IW4 menu constants
IW4 only extends the type enum so they can be shared
* refactor: clarify IW3 menu zone state naming
* fix: log IW3 menu conversion failures
* refactor: align IW3 menu list loader with IW4
* refactor: align IW3 menu dumpers with IW4
* refactor: align IW3 menu converter with IW4
* chore: use default enum numeration for operationEnum
* chore: small optimization on edit field capability initialization
* fix: iw3 menu optimizations for rect not considering relative position to parent
* chore: align iw3 menu converting closer to iw4
* chore: align iw3 menu dumping closer to iw4
* fix: not dumping menu flags properties correctly
* chore: adjust iw3 expression dumping to work similar to iw4
* chore: adjust iw3 expression converting to work similar to iw4
* chore: use unordered_map for MenuExpressionMatchers
---------
Co-authored-by: Jan Laupetin <[email protected]>