1.4.3.8
-------
Build fields, progressive objectives, and Zerg creep tumors:
- ``build_field_radius`` (tile BFS) vs ``build_field_radius_m`` (meters from ``(x,y)``); meter providers paint marks when ``build_field_persists`` / ``build_field_spreads`` — fixes Hatchery-only meter creep build checks
- Trigger ``register_objective`` registers primary numbers for victory without F9/voice; victory uses ``_required_objective_numbers`` vs ``_completed_objective_numbers`` (no premature win when goals are revealed one-by-one)
- F9 / ``add_objective``: "Primary objective N:" when multiple goals; colon after number; single goal omits number
- StarCraft mod: Queen **Spawn creep tumor** / tumor **Extend creep tumor**; skill attrs ``summon_requires_build_field``, ``summon_requires_marked_field``
- docs: ``docs/en/progressive-campaign-objectives.md``, ``docs/en/starcraft-zerg-creep.md``; ``modding.rst``, ``mapmaking.rst``
- tests: ``test_build_rules.py`` (creep tumor), ``test_campaign_alliance_transfer_triggers.py`` (register_objective), ``test_objective_announce.py``
1.4.3.7
-------
Hunting system and wildlife voice labels:
- Age of Empires–style hunting: ``is_huntable`` animals leave ``food_carcass`` deposits; workers gather them; deer/sheep flee; sheep can be herded (``can_herd`` / ``herdable``)
- Wildlife announced as "animal" (e.g. "deer , animal"), not "neutral , NPC"; square summaries use a separate animal bucket
- Wildlife-only ``computer_only`` slots do not join the ``"ai"`` alliance (not with players, hostile creep, or other herds; mixed slots unchanged)
- Ctrl+Shift+F4 to a wildlife-only player says "you are animal"; mixed NPC + wildlife players still say "you are neutral NPC"
- Random maps spawn wildlife and orchards near starts; ``hunting_techniques`` improves carcass gathering
- docs: ``docs/en/hunting-system.md``; ``modding.rst`` hunting section
- tests: ``soundrts/tests/test_hunting.py``, ``test_hunting_herd.py``, ``test_wildlife_identification.py``, ``test_wildlife_alliance.py``
1.4.3.6
-------
Burst / sequence attacks (``damage_seq``):
- fixed burst interval: rules ``(interval …)`` is now respected (was hard-coded to 0.4 s)
- omit ``(damage …)`` to auto-split base ``mdg`` / ``rdg`` evenly (supports fractional damage)
- each shot in a burst triggers ``launch_matk`` / ``launch_ratk``; list multiple sound IDs in ``style.txt``
- base rules: new ``repeating_crossbowman`` (upgrade from archer; Age of Empires Chu Ko Nu style)
- tests: ``soundrts/tests/test_damage_seq_burst.py``
- docs: ``docs/en/burst-attack-damage-seq.md``; ``modding.rst`` Combat system section
1.4.3.5
-------
Combat AI vs neutral units:
- player units in ``offensive``, ``defensive``, or ``chase`` mode do not auto-attack neutral
units (``computer_only ... neutral``)
- defensive mode does not flee when only neutrals are present
- forced attack (``imperative`` go/attack, e.g. Ctrl+click on the unit) still works
- neutral creeps remain guard + counter-attack on their side; see ``docs/en/unit-default-behavior.md``
1.4.3.4
-------
Procedural random map generator (RMG):
- Entry: main menu **Start a game** → **Random map**; or **Random map** in the online create-game map list
- Options: template (standard/fast/macro/lanes), size, player count, 2v2 teams, monsters, resources, terrain, water, treasure, seed, treaty
- After generation, seed and share code are announced; **F5/F6** replay them from voice history (still available in the invite-AI menu)
- **Import share code** skips step-by-step menus; format ``RMG1:…`` — see `Random map guide <randommap.htm>`_
- Menu text inputs (share code, seed, login, etc.) support **Ctrl+A/C/V/X** select all, copy, paste, cut
- Code: ``soundrts/randommap.py``, ``soundrts/randommap_menu.py``; tests ``soundrts/tests/test_randommap.py``
1.4.3.3
-------
Indexed conditions (``killed_target`` / ``npc_has_item`` / ``unit_lost`` / ``building_lost`` / ``key_unit_killed``):
- Global spawn index (any square): ``(killed_target <index> <type> [enemy|ally])``, ``(npc_has_item <index> <type> <item>)``, ``(unit_lost <index> <type>)``, ``(building_lost <index> <type>)``, ``(key_unit_killed <index> <type>)``
- Square index: ``(killed_target <square> <index> <type>)``, ``(npc_has_item <square> <index> <type> <item>)``, etc.
- Same index rules as ``killed_target`` / ``npc_has_item``; only the Nth spawned unit/building at that square
- Example: ``(building_lost 1 townhall) (defeat)`` fails only if the 1st spawned town hall is destroyed (any square); ``(building_lost a1 1 townhall)`` is square-specific; ``(unit_lost 3 footman) (defeat)`` fails only if footman #3 dies
- Demo: base_campaign chapter 1; see ``docs/en/map-unit-index-selectors.md``
- Tests: ``soundrts/tests/test_map_select_loss_triggers.py``
game:
https://www.dropbox.com/scl/fi/z2ci8e54cklhg7rr41onv/soundrts-1.4.3.8-Ultimate-version-windows.zip?rlkey=2wgew4l510stzfbi9ymwcs31m&st=oq1v8hbe&dl=1