# WARDOGS Artillery Assistant — sources and calibration

Checked 22 September 2026. This is an independent, unofficial game companion, newly implemented in plain HTML/CSS/JavaScript. No account, backend, CDN scripts, telemetry or external service is needed at runtime. All 768 map tiles are bundled (256 per map).

## Provenance

- Official game identity and gameplay context: https://store.steampowered.com/app/1867240/WARDOGS/
- MetaForge map overview and published L52 example: https://metaforge.app/wardogs/map
- Community map coordinates and L81 table: https://github.com/apollyon-sys/wardogs-calculator
- Exact community snapshot: c77ca39c688b371bacb76a33c93a0e479b3f5138. Files used: maps/bakurani.json, maps/ozeti.json, maps/zestafona.json and data/weapons.json. The original application was not copied; these data were used to implement a new app. See THIRD-PARTY-LICENSE.txt for the Apollyon MIT notice.
- Public tile source: https://assets.wardogs-artillery.com/releases/assets-v1/maps/tiles/bakurani/zoom_4/{x}_{y}.webp, x/y 0–15. This is a 4,096 × 4,096 pixel overview, approximately 4 metres per pixel; use typed coordinates for precision. Imagery is a WARDOGS game asset, not MIT-licensed original project material. WARDOGS names, assets and trademarks remain with their respective owners. Neither this app nor the upstream community tool is official.
- Cloudflare upload instructions: https://developers.cloudflare.com/pages/get-started/direct-upload/

## What is supported

Map coordinates use X east, Y north, 100 metres per coordinate unit. Tile bounds: X −0.03 to 163.81, Y −0.01 to 163.83. Each bundled terrain square is 16,384 metres across. Community playable bounds are narrower: X 23.35–133.6, Y 19.34–129.65. Placement outside those playable bounds remains possible because terrain imagery extends beyond them. Map distance is horizontal Euclidean distance. Bearing is clockwise from north; azimuth uses 6,400 mils per turn. Coincident points have no bearing.

L81 uses piecewise linear interpolation of the community table, restricted to the source profile's declared 132–684 m range and 150–850 dial mils. At 450 m it returns 525 dial mils. MetaForge lists a wider 80–684 m range, and the community file contains extra rows outside its declared limits; those rows are intentionally excluded. No L81 time-of-flight table was available in the inspected source.

L52 uses MetaForge's listed 600–2,600 m range and its published 2,000 m reference: low arc 251 mils / 12.3 seconds; high arc 1,048 mils / 33 seconds. Those are source-reported, not independently verified in game. A single reference point does not define a ballistic curve: all other L52 distances show unavailable elevation/timing until user measurements cover them. The reference is matched at numerical precision, not by rounding a nearby distance to 2,000 m.

The separate SPH-2 community table is NOT treated as an L52 table. For example, its low-arc interpolation near 2,000 m differs from MetaForge's L52 example. A name or platform equivalence was not established. MetaForge's interactive page could not be retrieved directly because of its access challenge; no protected API or private data was accessed. The public overview was readable, but it did not provide a complete reusable firing table.

## Required in-game calibration

1. Confirm the current build, exact weapon, ammunition and available dial range. Check two widely separated landmarks against the map coordinates. The imagery and alignment are community-sourced, not newly measured in game.
2. On flat ground, place the gun and target using in-game coordinates. Level the cannon. Adjust the game's dial until repeated rounds land at the target. Record distance and dial mils. Measure time from launch to impact if timing is needed.
3. Repeat at several distances for each weapon and each L52 arc. Enter `distance,mils,seconds` in the calibration panel. Seconds may be omitted. One sample works only at its exact distance; two or more samples allow linear interpolation inside their coverage. No extrapolation is performed.
4. The calibration overrides the selected profile's bundled table. High and low L52 samples remain separate. The source range limits remain in force. Missing time samples do not produce guessed times.
5. Test intermediate distances not used to create the table. If results drift, collect more samples and retest after patches. Export the plan to preserve or share the measurements.

No terrain-height, obstacle-clearance, vehicle pitch/roll, drag model or ammunition compensation is implemented. Dial mils are empirical game values and must not be converted to a physical elevation angle. An in-range result indicates only the listed range envelope, not a validated trajectory or guaranteed hit. Every solution should be ranged in game.

## Local data

Gun/target positions, weapon selection, saved targets and calibration are stored in this browser's localStorage. Export/import provides a portable JSON plan. Import replaces the plan for the map identified in the file and switches to it. Version 1 plans are treated as Bakurani plans. No multiplayer synchronization or share-link service is included. Clearing browser data deletes local plans; exported files preserve them.


## Version 2: Ozeti and Zestafona

Both maps use the same pinned community repository snapshot cited above. Their tile sources follow the same URL pattern with `ozeti` and `zestafona` in place of `bakurani`. Each map has its own tower markers. All three source configurations declare the same tile bounds and 100 m per coordinate unit; marker positions are supplied in metres and converted to game units for display.

Ozeti community playable bounds: X 57.58–143.07, Y 21.81–99.56. Zestafona community playable bounds: X 19.90–124.89, Y 50.70–141.90. Playable bounds are distinct from the full terrain image bounds. Calibration against the current game build remains necessary on each map.

Each map retains independent positions, saved targets and user ballistic measurements. Existing version 1 browser data migrates to Bakurani without deleting the original storage entry. Export includes the selected map's plan only. Import leaves other maps' plans intact.
