Voraussetzungen: If two minefields overlap, i.e. Radius_1 + Radius_2 > Sqrt((X_1-X_2)^2 + (Y_1-Y_2)^2), they interact unless any of the following holds:
- Minenfelder haben unterschiedliche Typen (Fangminen vs. normal) und AllowMinesDestroyWebs ist ausgeschaltet (Standardeinstellungen)
- Minenfelder gehören dem selben Spieler
- Minenfeld-Besitzer sind verbündet und haben eine beidseitige Minenfeld-Allianz
Im 1:1-Fall, wenn also zwei gegnerische Minenfelder überlappen, wird folgende Formel benutzt:
Mines_exploding = Min(Units_1, Units_2) ...if Dist = 0 Units_1 ...if A < 0 Units_2 ...if A > D Units_1 - A^2 ...otherwise ...with D = Distance between minefield centers A = (Units_1 - Units_2 + D^2) / (2*D) Units_1, Units_2 = Number of mine units contained in both fields
Diese Formel wird verwendet, wenn AlternativeMinesDestroyMines eingeschaltet ist und ein gelegtes oder vergrößertes Minenfeld ein anderes überlappt. In diesem Fall geht PHost alle Minenfelder in Id-Reihenfolge durch, sucht nach feindlichen Überlappungen, und wendet obige Formel an.
During the Mines destroy Mines stage of host processing, PHost uses more complicated formulas. The basic ideas are the following: a minefield that overlaps N hostile minefields shrinks at a speed of N minefield units per time unit. For each minefield pair, we can therefore compute the time until the overlap is gone. PHost now computes the minimum such time, and removes N * Time units from all minefields. At least one overlap is gone now. All the speeds are now recomputed, and the algorithm restarts if overlaps remain.
Time_until_overlap_gone = Min(U1 / S1, U2 / S2) ...if D=0 (i.e. concentric minefields) U1 / S1 ...if U2*S1 - U1*S2 ≥ D^2 * S1 (i.e. field 2 eliminates field 1 completely) U2 / S2 ...if U1*S2 - U2*S1 ≥ D^2 * S2 (i.e. field 1 eliminates field 2 completely) (U1 - A^2) / S1 ...if S1 = S2 ((U1-U2-D^2)*S1 - (U1-U2+D^2)*S2 + 2*Sqrt(D^2 * (U2*S1^2 - (U1+U2-D^2)*S1*S2 + U1*S2^2))) / (S1 - S2)^2 ...otherwise ...with D = Distance between minefield centers A = (U1 - U2 + D^2) / (2*D) U1,U2 = Mine units in both fields (Units_1, Units_2) S1,S2 = Shrink speeds, i.e. overlap counts for both fields
Die überwältigende letzte Formel ist die Lösung zu Sqrt(U1 - S1*x) + Sqrt(U2 - S2*x) = D und wurde mit Mathematica ermittelt.
Der tatsächlich verwendete Programmcode ist stark auf Geschwindigkeit optimiert. PHost betrachtet nicht alle Minenfelder auf einmal, vielmehr werden die Minenfelder zuerst in Gruppen eingeteilt (wähle ein beliebiges Minenfeld, füge der Gruppe alle Minenfelder hinzu, die anhand Besitzer/Position/Typ mit diesem interagieren, füge alle Felder hinzu, die mit den gerade hinzugefügten Feldern interagieren, usw.). Außerdem wird, um Fortschritt garantieren zu können, die Zeit immer um mindestens einen Minimalwert Epsilon fortgeschrieben, wodurch es passieren kann, dass ein Minenfeld eine Handvoll Einheiten mehr verliert, als zur Entfernung aller Überlappungen nötig gewesen wäre. Epsilon ist momentan das Reziproke der maximalen Überlappungszahl der aktuellen Gruppe, mindestens jedoch 1/16. Dieser Wert wurde empirisch durch Testen als Kompromiss zwischen Genauigkeit und Geschwindigkeit ermittelt.
Um in einem Client Mines-Destroy-Mines vorherzusagen, reicht es vermutlich aus, Epsilon von 1/16 anzunehmen.
Nach der Ermittlung aller Verluste versucht PHost, sie wieder in die Spieldaten zu übernehmen und an Spieler zu melden. Die zitierten Formeln können zu Ergebnissen wie "Minenfeld-Paar #17/#233 verliert 0.12 Einheiten" führen. Da die Anzahl Mineneinheiten aber eine ganze Zahl sein muss, muss hier gerundet werden. Wenn Loss(A,B) der Verlust eines Minenfeld-Paares A/B ist, den obiger Algorithmus ermittelt hat, dann ergibt sich die Anzahl, die in util.dat-Eintrag 29 und in der Subraumnachricht gemeldet wird, nach der Formel
Rounded_loss(A,B) = Min(Ceil(Loss(A,B)), Units_A, Units_B)
(4.1a) Falls aufgrund dieser Formel ein Minenfeld weniger Minen verliert, als zur Auflösung aller Überlappungen nötig war, entfernt PHost nachträglich die überschüssigen Minen mit util.dat-Eintrag 53. Das passiert üblicherweise nur, wenn ein Minenfeld sehr viele andere Felder überlappt.