# en - fao # Artillery Fire Control with Forward Observer in \"Foxhole\" ## [🇨🇳](https://hackmd.io/@j2B-AmOOTCeGtnWJUgacVQ/S1YateMcbl) [🇩🇪](https://hackmd.io/@j2B-AmOOTCeGtnWJUgacVQ/B19sIkM9bx) [🇬🇧](https://hackmd.io/@j2B-AmOOTCeGtnWJUgacVQ/Bk5YP1Gq-x) [🇫🇷](https://hackmd.io/@j2B-AmOOTCeGtnWJUgacVQ/BJ_8d1z5-x) [🇭🇺](https://hackmd.io/@j2B-AmOOTCeGtnWJUgacVQ/HyisfPZf-g) [🇷🇺](https://hackmd.io/@j2B-AmOOTCeGtnWJUgacVQ/HyeZKyMcbl) ## TLDR - Know where the target is - Know where the gunners are - Know where **YOU** are The system calculates the rest and notifies the participants. #Discord(in near real-time, even via Discord!!!) 📺 https://youtu.be/d2amVYxveRQ _(some basic stuff)_ 📺 https://youtube.com/shorts/TMTIpF0tUo8 📺 https://youtube.com/shorts/dej4U97RMbI The program’s goal is to bring participants together into a group. It delivers the data to gun crews in a **standardized, easy-to-read format**. > Despite appearances, this is a text-based Telegram application, with only a very small part dedicated to map visualization. ![image](https://hackmd.io/_uploads/Sk48R82G-g.png) [It’s actually the same.](https://foxhole-map.dob.systems) ![faoLarge](https://hackmd.io/_uploads/H11rXPWGbe.png) ![image alt](https://barcode.tec-it.com/barcode.ashx?data=https%3A%2F%2Ft.me%2FfaoHelper_bot&code=MobileQRCode&eclevel=L) [https://t.me/faoHelper_bot](https://t.me/faoHelper_bot) > All of these are machine-translated, except for Hungarian and English. If you’d like to help with translations or have found a mistake:[![Crowdin](https://badges.crowdin.net/faomanual/localized.svg)](https://crowdin.com/project/faomanual) # How to use the Telegram bot It primarily assists the scout in their work, but the real benefits emerge during group operations. > The slash (`/`) commands mentioned below do not always need to be typed manually. A context-specific keyboard is displayed to the user, including the most important commands. Only the coordinates need to be entered. ## Creator **/start** **/create** This creates a room; the creator becomes the owner and is given the scout role. Other participants can join using the room code. ... Typical workflow:* Assign roles * Determine positions * Create vRefs * Fire control **/leave** It removes all participants, deletes the vRefs, and deletes the room. ## Team members **/start** In this case, the user joins the room as an artillery operator, which can be changed by the battery commander or the scout _(**[role](#role)**)_. # Basics ## Coordinates – MapCode On the map—depending on the mod—the coordinates of a given position can be read. If you Ctrl-click on the map, it will also be posted in the current chat. _(Applies only to the current hex.)_ ![Pasted image 20251205135126](https://hackmd.io/_uploads/B1Ih4vbGWx.jpg) At a slightly lower magnification, the map grid is more visible, and within it the 3x3 division. Naturally, they work with a slightly different format, as their purpose is different. **Colonial Home Region-K9k3** = (**map name**)-(**x**)(**y**)k(**sg1**) > In spoken English, the separator ‘k’ is called ‘keypad’ | function | value | | -------- | -------------------- | | Map Name | Colonial Home Region | | x | K | | y | 9 | | sg1 | 3 | This allows you to pinpoint an area of roughly 42 × 42 meters on the map. :::info :information_source: “When driving a vehicle, the displayed map covers about ~360 meters. This can be helpful when deciding where to position the artillery in relation to the target. :::warning :warning:_however, it may appear smaller on other resolutions_ ::: I changed this as follows: - I omitted the map name - The separating letter \"k\" is replaced by \".\" . _(faster typing)_ - I subdivide the subgrid into 9 additional squares. > This results in a grid with roughly 14-meter resolution. (Longer coordinates may also appear in the program; these are computed values. They have an accuracy of up to 10 cm) ![FoxholeMapCode](https://hackmd.io/_uploads/Hy3bSPZfZx.png) ### format: (**x**)(**y**).(**sg1**)(**sg2**)==(**sgX**)...== | Feature | Value | Grid size | | ------- | ----- | -------------------: | | x | k | | | y | 9 | 125m | | sg1 | 4 | ~42m | | sg2 | 7 | ~14m | | ==== | ==== | ==== | | ==sg3== | | ~5m | | ==sg4== | | ~2m | > The map shows both the coordinates and the grid boxes, which can be useful as a starting point ![image](https://hackmd.io/_uploads/H1m_1dlEbl.png) ## Polar coordinates, or vectors Playing with the coordinates of the previous map is a rough guess compared to what the accuracy of a well-connected vector network can provide. This may sound very harsh at first, but with a few simple practices and teamwork, ==accuracy within a meter== can be achieved. ![faoVectorChain](https://hackmd.io/_uploads/HJDiMKbf-g.svg) ### Use of rangefinder Normally, it shouldn’t cause any issues. You look at it, read the direction and distance, record it and you're happy 🥳. > [!Caution] **The practice shows a slightly different picture.** The measurement was taken from one point. Without moving, I only rotated the camera. (from vRef-02, at a distance of ~72 meters, with a building in the lower-left corner) \*\*The most accurate result was achieved when the target was below my position, effectively giving a top-down view of the building and minimizing error. _(ideally the target direction is towards the bottom edge of the screen)_ The others were to the right, left and forward of my position. The errors are clearly visible at angles and distances _(5-8m)_. ![image](https://hackmd.io/_uploads/BJPc4FIobx.png) > [!Tip] If time and circumstances allow, it’s worth paying attention to this small detail or practicing it to increase accuracy. > [!Warning] > My biggest and most common mistake is that sometimes after a move I **forget to set my new position** and take new points relative to the old position. It’s a subtle error, and I usually only realize it after the problem has already occurred. If I've just measured a target, it's not a big problem, but if I've just worked ahead and measured a section of the frontline... Then it's downright painful 😭 > This can be easily checked on [map](#map), or if the gunners indicate that the range or direction is very wrong. > So it's important to periodically check the map to see what I'm doing, and _(especially if most of the team is on Discord)_ to send the map to Discord. _(it's inside /helpers if you have [webhook](#discord) enabled for the room)_ > _If everyone is on Telegram, you don't have to worry about sending. Anyone can request a map of the current state._ > With a blank map _(no hex set and nothing linked to a map coordinate)_ it is much harder to detect errors. ( _except I can't see where the bullet hit_ 🤣 ) # Tasks ## Spotter If he organizes his work and his team well, he only has to locate the targets ### Basic commands #### /t Sets the current target for the group. This can be done from **mapCode**, **polar** or [tp](#vRef). On deployment, with the offset and wind parameter set, all gunner participants _(**[role](#role):** arty, main battery and fp)_ receive their own -unique- firing data. #### /mypos > **mapCode** - absolute positioning > **polar** - if you want to move somewhere. You pre-mark your future position and then operate from there > **reference+polar** - the reference can be the target, a teammate or a vRef. If you want to locate your own position from the **target** use the '💢' button, otherwise choose from the list. > The system calculates your new position compared to the reference #### /moveto moving a teammate. > **index+MapCode** - absolute positioning > **index+polar** - calculates the teammate's position relative to you. #### /offset This is only added to the target coordinate. _In a well-structured network with properly set wind, this is not necessary._ The [**/o2w**](#o2w) command can change this. **polar** - calculates the offset from the vector between the specified point (e.g. impact) and the target. When a new offset is added, the displacement is added to the previous offset. \*(it accumulates) If you’ve completely lost track, it can also be reset. ![faoOffset](https://hackmd.io/_uploads/ByKDVtZz-g.svg) ##### Lateral angle table if you'd rather do the math in your head | | 5m | 10m | 20m | 30m | 40m | | ---- | --------------------: | --------------------: | ---------------------: | ---------------------: | ---------------------: | | 100m | 2.86° | 5.71° | 11.31° | 16.70° | 21.80° | | 200m | 1.43° | 2.86° | 5.71° | 8.53° | 11.31° | | 300m | 0.95° | 1.91° | 3.81° | 5.71° | 7.59° | simplified: | | 5m | 10m | 20m | 30m | 40m | | ---- | -------------------: | --: | --: | --: | --: | | 100m | 3° | 6° | 11° | 17° | 22° | | 200m | 1.5° | 3° | 6° | 9° | 11° | | 300m | 1° | 2° | 4° | 6° | 8° | A good rule of thumb is that at 100 meters, every 5 meters equals roughly 3°. This also works in reverse: with 5 m spacing between the guns, at a distance of 100 m, the direction must be adjusted by 3° so they fire at the same point even differently: **300/distance** = 5m side angle e.g.: 150m at 15m side distance (300/150) \* (15/5) = 2 \* 3 = ~6° _(edited/counted: 5.71°)_ > if you want to be more precise **286/distance** #### /o2w If you already have a well-set offset, it is possible to switch to wind parameters. Select the target and the system will convert the wind based on the distance and the projectile _(offset is reset)_. This way, guns at different distances and/or different guns can accurately fire at the same targets. _(until the next wind change)_ ### sessions #### just the map Even If all participants are positioned using the more precise (xy.ss) coordinates, a **==maximum error of ±28m==** still occur! Apply an offset from the first few volleys, then continue until the next wind adjustment the gun can accommodate. _(at similar ranges and with the same guns)_ In this case, _(since the exact positions of the participants and the target are unknown)_ [**/o2w**](#o2w) will return incorrect data!!! The position error and wind compensation are cumulative. The next paragraph shows that taking accurate references isn’t necessarily difficult. **Even over long distances, without chaining!** This is related to the option of loading public buildings [vRef-buiding](#vRef-🃏). Precise, with one fewer potential error. #### vector chains It selects a reference point (which can be itself, a battery commander, or the target). The important thing is that it roughly matches the map). ##### onSubGrid I align myself with the subgrid on the map. I fix my position at the coordinate of the subGrid _(**/mypos k9.7**)_, and from there I start to fix other points or a well identifiable landmark (and put the vRef-00 here) This is what you see (k9.7): ![image](https://hackmd.io/_uploads/HJxPa7jObg.png) ![image](https://hackmd.io/_uploads/B1fEU9aDbx.png) In the image above, the vRefs are chained to the corners of the bridges _(useful, as they remain visible even from cover)_ After this, the other participants are linked relative to the reference point. In this case the position error is minimal, in theory only the wind has to be compensated. ![faoVectorChain](https://hackmd.io/_uploads/HJDiMKbf-g.svg) #### mixed chains At long distances, it would be inconvenient to measure the whole course _(not to mention large bodies of water and mountains. [**example**](#Ismert-hibák))_. With the [**onSubGrid**](#onSubGrid) mentioned earlier, you can create two separate chains without any loss of accuracy. ![faoMixedChain](https://hackmd.io/_uploads/BJH7V6Z9-e.svg) #### movements If you have already built up an accurate network you can move with **/mypos** (**polar**, **reference+polar**) with essentially no loss of accuracy. If you want to cover a longer distance with binoculars you can use vRef as a temporary marker ## Main Battery aka Lead Battery It reduces the spotter’s workload, as they only need to position the battery commander rather than everyone. ==After the battery commander has been given an accurate position position==: 1. determines the position of the batteries in the vicinity by **/moveto index+polar**. 2. the batteries measure their own position relative to the leader **/mypos reference+polar** (much more binoculars, shorter time) This way, the bats do not have to be on top of each other, thus avoiding that a counter-attack can knock the whole grouping out of 1-2 series. Everyone gets individual shots, without chaos! ### Movement If he moves he can measure himself back to the grouping and vice versa. The important thing is that at least **one reference stays in place while the others move** (this applies to all participants in the network). ## Wind (role) > [!Caution] Currently unusable. Data entry works, counting doesn't > with **120** and **150** you might be able to use **[Wind Sock](https://foxhole.wiki.gg/wiki/Wind_Sock)** If you have installed [Wind Sock](https://foxhole.wiki.gg/wiki/Wind_Sock), you can view and adjust the wind parameters. Wind strength indication: 🧦 You can also guess from the [flag](https://foxhole.fandom.com/wiki/Wind) displayed on buildings. Wind speed indicator: 🚩 ![image](https://hackmd.io/_uploads/SJUxDqnPbe.png) > in calm conditions, the 120mm at 220 yards averaged 4 hits in 10 shots on a target the size of a house. This shows how much dispersion affects the result ## vRef 🃏 The Jolly Joker! Marker pole. Any kind of land feature, building, tree, maybe something that is visible at night or even if it is hidden (e.g. a rock). These references can be used during motion. > ==**tp**== **target point**, and - unlike **fp** - **does not count as a battery**! So it is not included in the firing data calculation. It can be directly imported as a target. > ==**fp**== **firing position** Marking a planned firing position on the map or a battery that is not on Telegram. When processing, the scout receives a firing data for **fp** that he can call out (Discord). Or ==**Discord webhook**==. You can also assign a gun to this. > ==**lp**== **loading position** planned reloading point. I have no firing data > ==**b**== **building** loads various public buildings belonging to the server (able, charlie) and the selected map. (town base, seaport, etc.) At most, only the buildings visible on the ‘secure map’ (default: N) will be shown here. > It acts like **tp**. > Format: **b-tb2-00** - Town Base 2 position ![image](https://hackmd.io/_uploads/HyCQpXOFZg.png) All items listed here [exportable](#export) --- # Commands ## /help it gives a description of all usable commands ## /name if your Telegram name is not the same as your Foxhole name, you should change it > this Telegram name is just your name displayed in Telegram, not a link to your profile ## /role Changes the role of the teammate. arty, spotter, main battery, wind ## /calc It calculates and displays the direction and distance from the target to the selected point. It works the same as /offset but it doesn't change the firing data, **it just gives information to the scout**. ## /arty In 2 steps _(ammo icon)_ assigns the appropriate artillery to the room or to the selected character _(role:**arty**, role:**main battery**, vRef:**fp**)_ ## /map You can select the current map. The recorded data can be viewed on the map. Delete the map from the room. ref: [icons](https://cyanavigation.com/how-to-read-and-use-military-map-symbols-a-beginners-guide/) ![image](https://hackmd.io/_uploads/Sk48R82G-g.png) ## /discordwebhook On the discord server you need to create a webhook, [more](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks). The full route of this should be provided. This is fixed for the user, so when you create a new room, you only need to enable it if you need it. ![image](https://hackmd.io/_uploads/Sk0AGwnE-l.png) ## /discord If you have set the **webhook** and you are the creator of the **room** you can enable or disable the sending of data. It only sends items that do not have a telegram id. _(**fp**)_ In case of a change of a firing data _(new target coordinate, offset, wind change, whatever you **record**)_ it is sent automatically, map is sent only on request. ![image](https://hackmd.io/_uploads/ByHfzvhVWg.png) :::warning when creating the webhook, preferably name it **FAO Bot** and use the [download here](https://cdn.dob.systems/faoLogoDiscord.png) image as the icon. ::: ## /export Creates a text containing the current vRefs and the map. For example, these are the targets of the artillery ranges, with a few reference points and a few firing positions ### Colonial ![image](https://hackmd.io/_uploads/B1fEU9aDbx.png) :::success #### map, vRefs and firing positions ``` MapHomeRegionC.webp;16:vRef-00::k9.7;16:vRef-01::k9.997969;16:vRef-02::l8.336574;16:vRef-03::m8.277724;16:vRef-04::m8.635414;64:fp-120-0:6:k9.798827;64:fp-150-0:11:k8.165619;64:fp-150-1:11:k8.138384; ``` ::: :::success #### first island targets ``` 32:tp-00::l9.776811;32:tp-01::l8.179713;32:tp-02::l8.137288;32:tp-03::l8.183941; ``` ::: :::success #### second island targets ``` 32:tp-10::m8.143182;32:tp-11::m8.161769;32:tp-12::m8.251291;32:tp-13::m8.355868;32:tp-14::m8.669534;32:tp-15::m8.65748;32:tp-16::m8.562831;32:tp-17::m8.429377;32:tp-18::m8.442436; ``` ::: :::success #### platforms around the island ``` 32:tp-20::m9.728329;32:tp-21::m9.861159;32:tp-22::n9.745249;32:tp-23::n9.859564;32:tp-24::n8.285147;32:tp-25::n8.813321;32:tp-26::n7.216491;32:tp-27::m7.332171;32:tp-28::m8.887164;32:tp-29::m8.775328; ``` ::: ### Warden ![image](https://hackmd.io/_uploads/rJRYLspvZx.png) :::success #### all in one ``` MapHomeRegionW.webp;16:vRef-00::h7.6;16:vRef-01::h7.454;16:vRef-02::g7.449721;16:vRef-03::f7.28883;16:vRef-04::f7.179924;32:tp-00::g7.666159;32:tp-01::g7.368594;32:tp-02::g7.651694;32:tp-03::g7.358721;32:tp-10::f7.638919;32:tp-11::f7.339421;32:tp-12::f7.351988;32:tp-13::f7.654397;32:tp-14::f7.561633;32:tp-15::f7.242684;32:tp-16::f7.161881;32:tp-17::f7.453239;32:tp-18::f7.141389;32:tp-20::f7.967826;32:tp-21::f7.858639;32:tp-22::f7.747834;32:tp-23::e7.859944;32:tp-24::e7.553933;32:tp-25::e7.237159;32:tp-26::e8.831146;32:tp-27::f8.712447;32:tp-28::f8.822923;32:tp-29::f8.931654;64:fp-120-0:7:h7.619581;64:fp-150-0:12:h7.37651;64:fp-150-1:12:h7.613273; ``` ::: ## /import This allows you to load a previously created export into the current room. The import does not overwrite anything and does not check for duplication. In case of a name conflict, there will be several references with the same name. --- # requirements: ## Telegram you can use it on desktop or on mobile/tablet ## Discord\* I understand that Telegram is less popular in the western hemisphere, so I'll provide the possibility to send the data and the map to [Discord](#discordwebhook). **Only the room creator can set it.** ![image](https://hackmd.io/_uploads/H1VpfUAmWx.png) # Saved data or the GDPR **Telegram id** and **name** _(which you can change at any time)_, only these are stored as personal data. In addition, the **Discord webhook** may also be considered personal data, which you can change or delete at any time. The **Telegram id** and **webhook** **never gets published, anywhere**! _(**name** only in the current room)_ **I will not use this data for any other purpose and will not disclose it to anyone else!** I may make mistakes, but I will do my best to ensure that no personal information is leaked or falls into the hands of third parties! ### Periodically I will completely delete the database! Unused rooms will be deleted within ~2 days, inactive users after ~30 days. _This is not a ban, only your data will be deleted from the system. Can be reactivated at any time._ Within the application, I provide the possibility to **view**, **modify** and **delete** your recorded data # Supporters ## Special Thanks To: - **Vizi** for the \"test shoot\" - **LMT** for the link to \"another\" gunner's app - **Thunderz** for the English translation. -------- # Known issues > [!Caution] Wind calculation! Currently partially usable > [!Caution] Sometimes it is not responding, I'm working on this bug! ![image](https://hackmd.io/_uploads/B1_oX7Xd-g.png)