Repository navigation
Custom Projectiles 1.8.15 — native flight tester
Pre-releaseOptional target-unit/group ammunition, save-retuning/manual-range fixes, and native projectile flight configuration. Fixed-speed replacement projectiles can fall short despite a valid target range. New root projectile_physics delegates fixed-speed/fixed-angle/adaptive-angle settings to Rebalancer's existing API; fixed angle asks the native game to compute launch speed for the prepared target. No new native hook, binding, trajectory solver or damage system.
1.8.15 tester downloads: module ZIP · Reconquista YAML · full vanilla YAML · VS Code schema · long-range flight example. GM dependency: GM owner 0.3.1 ZIP. ZIP SHA-256 1554b1deee3e386000e064b6be7167a90da7c05e8a442770c5f7a85a0ab0c3f4; all five artifacts have checksum files.
projectile_physics:
firethrower_pot: {mode: fixed_angle, angle: 30}
units:
Catapult:
projectile: firethrower_pot
interval: 700
range: 40Flight tuning is opt-in and global per native type, including sprite variants. Activate Rebalancer 1.1.3+ with your existing balance file/plugin first; this module does not automatically enable its unrelated balance hooks. fixed_speed requires speed: 1..1000 in native units; fixed/adaptive angle require angle: 1..89 degrees. Omission/native leaves current values alone. Fire-ballista bolts share ballista_bolt flight; custom sprites inherit their base type. Native range/eligibility, collisions, terrain, damage, allocation, attribution and cleanup remain in place. No promise of hits through walls or arbitrary height/angle combinations.
Initialization uses the framework's existing afterInit event after balance files enabled. Actual Rebalancer 1.1.3/1.1.4 implementations and caller were inspected; its existing UCP AOB table bindings are reused. No private resolver, copied flight table, competing hook, per-frame allocation/world scan or RNG draw. The owner/binding/final-diff inventory is in NATIVE-AUDIT.md.
Prior included features: ammo_by_target.units/.groups with named unit_groups; exact unit rules win, unmatched targets keep existing behavior, regular/cow choices retain their separate slots/counts. Reconquista prefers configured regular ammo against siege while other troops retain AIC cow behavior, with [cluster, units] allowing isolated targets. Native human/cow orders retain their ammunition paths. Native-timed manual targeting respects configured range with strict_range ON; false restores prior manual behavior. An already rejected wind-up finishes without firing.
Gameplay-edited format-5 saves load by default, resetting obsolete module firing queues/timers while preserving saved RNG seed and visual identities. Same settings resume unchanged. Root allow_config_changes_on_load: false requires original settings. Custom graphics definitions/slots must still match; older custom-graphics saves need one unchanged load/resave first. Flight options participate in this existing configuration identity when unit hooks are active.
The ZIP includes the complete inert vanilla reference for all 77 units and nine canonical native flight entries, editor schema with one shared physics definition, Reconquista and flight examples, README guide and short help in all nine GUI languages. The sole GUI control stays in established Legacy Balance Changes; Legacy source is unchanged.
Testing instructions:
- Install the tester in UCP 3.0.7+ with existing dependencies (map-extensions, protocol, ui 1.0.1+, GM owner 0.3.1). For the new flight block, activate Rebalancer 1.1.3+ with your existing balance config/plugin. Keep YAML beside the matching schema, select it in Customizations > Balance Changes, restart.
- Use the flight example: Catapult firethrower pots, interval 700, range 40, fixed angle 30. Test clear targets at 30/40 tiles, then repeat with Trebuchet, Mangonel and both ballistas. Repeat arrow, crossbow and sling replacements; verify trajectories finish near the intended native aim and produce the expected native impact. Compare with omitted/native physics and fixed speed to see the separate ballistic limit.
- Check uphill/downhill, walls/towers, moving targets and unit/building/ground orders. Verify native ownership, damage and fire behavior; the angle option does not bypass collision or eligibility. Confirm regular/cow slots, custom inherited sprites and native controls still work.
- Copy unchanged vanilla: no projectile hooks/timers/resource handlers should install and flight tuning should do nothing. With an active unit config, save during a staggered volley, resume unchanged, then retune physics/reload and reload; old queues reset. Strict load policy must reject changed settings; graphics definitions remain compatible.
- Compare identical configs/sprites in paired normal/Extreme multiplayer and recorder playback; test crowded long sessions before acceptance. Also repeat the Mangonel out-of-range/valid-retarget cases from 1.8.14.
Validation:
All 24 final physics/save/native-config feedback regressions pass. Six new tests execute actual Rebalancer API/table code and framework registration. Native flight covers 120 cases: normal/Extreme 1.41 × five engines × arrow/crossbow/sling/firethrower replacements × 30/40/50 tiles. The original native initializer, solver and movement/collision code finish within one tile of the prepared flat-ground aim, preserving shooter attribution. Tests also cover owner/event absence before mutation, parameter bounds/modes, table roots against decoded native readers, inert defaults, initialization ordering and saved configuration identity. All 23 GUI/archive tests pass for the package and nine locales. The preceding 34 existing dispatcher regressions passed, including the 77-unit/every-projectile allocation matrix and deterministic saved staggered volleys. A final shared-schema check passed after schema deduplication.
Provisional/draft: native desktop bindings are unavailable (recorded 2 October queued probe; no slot retained). Live rendered flight/impact/damage, paired multiplayer/recorder playback, long-match performance and broader executable variants remain unverified. Existing runtime startup diagnostics remain English; preview help is translated into all nine GUI languages pending human review. The separate trebuchet aiming/impact-damage report is not claimed fixed. No accepted Store release is claimed; its recipe stays pinned to merged 1.8.12 main until source/dependency/live acceptance.