blob: 79c296393c3d4852d86c6e61e725a13c7535e1f4 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001
2Teamkampf-Interna
3=================
4
5Verwaltung der Kampfreihen
6--------------------------
7
8Die Umordnung der Teammitglieder wird durch die Formation gesteuert.
9
10 formin[reihe] - Minimale Anzahl von Teammitgliedern in dieser Reihe
11 formax[reihe] - Maximale Anzahl von Teammitgliedern in dieser Reihe
12
13Die Funktion CheckFormation() passt die Werte so an, dass sie bei Anwesenheit
14aller Teammitglieder erfuellbar sind, wobei ggf. der Maximalwert vorne
15anfangend erhoeht wird und der Minimalwert hinten anfangend verringert wird.
16Dabei ist der Minimalwert der ersten Reihe 1.
17
18Es ist zwischen der Teamaufstellung und der Raumaufstellung zu unterscheiden.
19Die Teamaufstellung ist die Aufstellung, in der die Mitglieder angeordnet
20waeren, wenn alle anwesend waeren. In der Teamaufstellung ist durch die
21Funktion MakeFormation() sichergestellt, dass die Minimal- und
22Maximalanforderungen erfuellt sind.
23Die Raumaufstellung ergibt sich aus den anwesenden Mitgliedern der
24Teamaufstellung. Sollten die Minimalanforderungen einer vorderen Reihe nicht
25erfuellt sein, werden anwesende Mitglieder aus den hinteren Reihen IN DER
26RAUMAUFSTELLUNG nach vorne geschoben soweit noetig.
27
28Vor Verschiebungen und bei Updates der TEAMAUFSTELLUNG werden die Arrays mit
29den Mitgliedern jeder Reihe sortiert, wobei die gewuenschte Reihe der
30Mitglieder das groesste Gewicht (125) im Sortierkriterium hat und die Anzahl
31der Lebenspunkte einfach eingeht. Solange die Teammitglieder unter 250 LP
32haben, kann ein Mitglied mit wenigen LP hinter einem mit vielen LP einsortiert
33sein, der EINE Reihe weiter hinter stehen will, aber nicht zwei oder mehr.
34Wird es noetig, Mitglieder aus einer Reihe in eine andere zu verschieben,
35werden Mitglieder vom Anfang des Arrays nach vorne verschoben (an das Ende
36des davorliegenden Arrays) bzw. Mitglieder vom Ende des Arrays nach hinten
37(an den Anfang des dahinterliegenden Arrays). Dadurch werden immer die
38Mitglieder mit dem staerksten Drang nach vorne an die Front geschickt :-)
39
40Wenn jemand die Reihe wechselt und dabei die Minimalanforderung der Quellreihe
41unterschritten oder die Maximalanforderung der Zielreihe ueberschritten wird,
42wird mit CycleRows() rotiert. Kommt ein neues Mitglied hinzu und die
43Maximalanforderung seiner gewuenschten Reihe wuerde ueberschritten, wird
44in AddToRow() zunaechst versucht ein Mitglied eine Reihe vorzuschieben, falls
45da noch Platz ist, sonst eine Reihe zurueck, falls da noch Platz ist (die
46Anzahl der Mitglieder also < formax ist). Wird ein Mitglied entfernt oder
47gewaltsam entfernt und wuerde dabei die Minimalanforderung seiner Reihe
48unterschritten, wird in RemoveFromRow() versucht, ein Mitglied aus der
49nachfolgenden Reihe nach vorne zu holen, falls dort Ueberschuss vorhanden ist
50(in der nachfolgenden Reihe also mehr Mitglieder als formin sind), sonst aus
51der vorangehenden Reihe, falls dort Ueberschuss ist.
52
53Sollten diese Umordnungen nicht ausreichen die Formation in der
54TEAMAUFSTELLUNG einzuhalten, wird die Formation mit MakeFormation() erzwungen.
55Dies wird in zwei Durchlaeufen erreicht. Der erste Durchlauf wird von vorne
56nach hinten durchgefuehrt. Ist das Maximum einer Reihe ueberschritten, werden
57soviele Mitglieder nach vorne geschoben wie in der davorliegenden Reihe freie
58Plaetze sind und die restlichen ueberschuessigen Mitglieder nach hinten. Sollte
59das Minimum einer Reihe unterschritten sein, werden soviele Mitglieder aus den
60nachfolgenden Reihen hergeholt, wie zum Erreichen des Minimums noetig ist. Der
61zweite Durchlauf wird von hinten nach vorne ausgefuehrt. Falls das Minimum
62einer Reihe unterschritten wird, werden Mitglieder aus den davorliegenden
63Reihen geholt soweit noetig, wenn jedoch Ueberschuss vorhanden ist, wird
64dieser nach vorne geschoben.
65
66BEISPIEL:
67
68Formation 3-6 2-2 1-2 0-6 1-1 (bloedsinnige Formation ;-)
69
701. Durchlauf (vorne beginnend):
71
72 1 1 6 1 0
73 <---- (Minimum Reihe 1 unterschritten)
74 3 0 5 1 0
75 <-- (Minimum Reihe 2 unterschritten)
76 3 2 3 1 0
77 --> (Maximum Reihe 3 ueberschritten)
78 3 2 2 2 0
79
802. Durchlauf (hinten beginnend):
81
82 3 2 2 2 0
83 --> (Minimum Reihe 5 unterschritten)
84 3 2 2 1 1
85
86Ergebnis entspricht der gewuenschten Formation. Ermittlung der RAUMaufstellung:
87
88 2 0 2 1 1 (Anwesende aus der vorangegangenen TEAMaufstellung)
89 <----
90 3 0 1 1 1
91 <----
92 3 2 0 0 1
93 <----
94 3 2 1 0 0
95
96Ergebnis erfuellt Minimalanforderungen zumindest vorne, Maximalanforderungen
97koennen nicht ueberschritten werden, weil die Raumaufstellung hoechstens
98soviele Mitglieder wie die Teamaufstellung hat.
99
100
101Abarbeitung des Angriffsbefehls und Verteilung der Begruessungsschlaege
102-----------------------------------------------------------------------
103Das Grundprinzip ist folgendes:
104Wenn das ganze Team bewegt wird, werden die Begruessungsschlaege unter
105Vorbehalt weggelassen. Sobald alle Teammitglieder bewegt wurden, macht
106jedes Monster, das noch einen Begruessungsschlag ausfuehren muss, einen
107Schlag auf EIN Teammitglied das im Nahkampf erreichbar ist und der Vorbehalt
108wird fuer alle Mitglieder aufgehoben. Wenn ein Teammitglied versucht
109sich zu bewegen und noch ein Begruessungsschlag unter Vorbehalt fehlt,
110wird dieser noch vor der Bewegung nachgeholt.
111
112
113SIEHE AUCH:
114 Uebersicht: teamkampf
115 Properties: P_TEAM, P_ASSOC_MEMBERS, P_TEAM_ATTACK_CMD,
116 P_TEAM_AUTOFOLLOW, P_TEAM_COLORS, P_TEAM_LEADER,
117 P_TEAM_NEWMEMBER, P_TEAM_WANTED_ROW, P_TEAM_WIMPY_ROW
118 Bewegung: IsTeamMove, TeamFlee
119 Mitglieder: IsTeamLeader, TeamMembers
120 Kampf: AssocMember, DeAssocMember, InsertEnemyTeam,
121 SelectNearEnemy, SelectFarEnemy
122 Positionen: PresentPosition, PresentRows, PresentEnemyRows,
123 PresentTeamPosition, SwapRows
124 Sonstiges: TeamPrefix
125
126----------------------------------------------------------------------------
127Last modified: 16-08-2010, Gabylon